diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 88b4642..d3db9f5 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -4,6 +4,8 @@ on: push: branches: - main + tags: + - "v*" pull_request: workflow_dispatch: @@ -69,6 +71,18 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 + - name: Generate image metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + ${{ secrets.DOCKERHUB_USERNAME }}/docker-socket-proxy + tags: | + type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }} + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + - name: Build and push production image uses: docker/build-push-action@v7 with: @@ -76,11 +90,10 @@ jobs: file: ./Dockerfile push: true platforms: linux/amd64,linux/arm64 - tags: | - ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest - ${{ secrets.DOCKERHUB_USERNAME }}/docker-socket-proxy:latest + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} build-args: | - APP_VERSION=latest + APP_VERSION=${{ steps.meta.outputs.version }} APP_GIT_SHA=${{ github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/README.md b/README.md index 253ee41..f120180 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,18 @@ cerede2000/docker-socket-proxy:latest ghcr.io/cerede2000/docker-socket-proxy:latest ``` -La première référence est publiée sur [Docker Hub](https://hub.docker.com/r/cerede2000/docker-socket-proxy) ; la seconde sur GitHub Container Registry. Les deux images sont multi-architecture (`linux/amd64` et `linux/arm64`), construites avec Go et exécutées sans privilèges dans Distroless Debian 13. Chaque mise à jour de `main` validée par la CI les publie avec le tag `latest`. +La première référence est publiée sur [Docker Hub](https://hub.docker.com/r/cerede2000/docker-socket-proxy) ; la seconde sur GitHub Container Registry. Les deux images sont multi-architecture (`linux/amd64` et `linux/arm64`), construites avec Go et exécutées sans privilèges dans Distroless Debian 13. + +`latest` suit `main`. Chaque release Git `vX.Y.Z` publie également les tags Docker immuables `X.Y.Z` et `X.Y` sur les deux registres. + +## Ce qui le différencie + +Les socket proxies classiques limitent principalement les familles d'endpoints Docker. Celui-ci ajoute deux niveaux de contrôle complémentaires : + +1. Le droit est attribué au **client** par profil, automatiquement via son label Docker (`socketproxy.role`). +2. Le droit est ensuite limité à la **cible** : tous les conteneurs, allowlist, blacklist, refus explicite, ou accès strictement en lecture seule par conteneur. + +Un outil peut donc disposer d'un accès Docker étendu lorsque c'est nécessaire (Portainer, un opérateur), tandis que Traefik Manager peut uniquement consulter et redémarrer `traefik`. Le contrôle nom/ID est maintenu en cache et s'applique aux listes, événements et appels directs. ## Principes de sécurité