⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Using secrets with GitHub Actions

Table des matières

Un secret de construction est une information sensible, comme un mot de passe ou un jeton API, consommée dans le cadre du processus de construction. Docker Build supporte deux formes de secrets :

  • Les montages secrets ajoutent des secrets comme fichiers dans le conteneur de construction (sous /run/secrets par défaut).
  • Les montages SSH ajoutent des sockets d'agent SSH ou des clés dans le conteneur de construction.

Cette page montre comment utiliser les secrets avec GitHub Actions. Pour une introduction aux secrets en général, voir Secrets de construction.

Montages secrets

Dans l'exemple suivant, on utilise et expose le secret GITHUB_TOKEN fourni par GitHub dans votre workflow.

D'abord, créez un Dockerfile qui utilise le secret :

# syntax=docker/dockerfile:1
FROM alpine
RUN --mount=type=secret,id=github_token,env=GITHUB_TOKEN ...

Dans cet exemple, le nom du secret est github_token. Le workflow suivant expose ce secret en utilisant l'entrée secrets :

name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build
        uses: docker/build-push-action@v6
        with:
          platforms: linux/amd64,linux/arm64
          tags: user/app:latest
          secrets: |
            "github_token=${{ secrets.GITHUB_TOKEN }}"
Note

Vous pouvez également exposer un fichier secret à la construction avec l'entrée secret-files :

secret-files: |
  "MY_SECRET=./secret.txt"

Si vous utilisez les secrets GitHub et avez besoin de gérer une valeur multi-ligne, vous devrez placer la paire clé-valeur entre guillemets :

secrets: |
  "MYSECRET=${{ secrets.GPG_KEY }}"
  GIT_AUTH_TOKEN=abcdefghi,jklmno=0123456789
  "MYSECRET=aaaaaaaa
  bbbbbbb
  ccccccccc"
  FOO=bar
  "EMPTYLINE=aaaa

  bbbb
  ccc"
  "JSON_SECRET={""key1"":""value1"",""key2"":""value2""}"
Clé Valeur
MYSECRET ***********************
GIT_AUTH_TOKEN abcdefghi,jklmno=0123456789
MYSECRET aaaaaaaa\nbbbbbbb\nccccccccc
FOO bar
EMPTYLINE aaaa\n\nbbbb\nccc
JSON_SECRET {"key1":"value1","key2":"value2"}
Note

Les doubles échappements sont nécessaires pour les guillemets.

Montages SSH

Les montages SSH vous permettent de vous authentifier avec des serveurs SSH. Par exemple pour effectuer un git clone, ou pour récupérer des packages d'application depuis un dépôt privé.

L'exemple de Dockerfile suivant utilise un montage SSH pour récupérer des modules Go depuis un dépôt GitHub privé.

# syntax=docker/dockerfile:1

ARG GO_VERSION="1.24"

FROM golang:${GO_VERSION}-alpine AS base
ENV CGO_ENABLED=0
ENV GOPRIVATE="github.com/foo/*"
RUN apk add --no-cache file git rsync openssh-client
RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
WORKDIR /src

FROM base AS vendor
# this step configure git and checks the ssh key is loaded
RUN --mount=type=ssh <<EOT
  set -e
  echo "Setting Git SSH protocol"
  git config --global url."[email protected]:".insteadOf "https://github.com/"
  (
    set +e
    ssh -T [email protected]
    if [ ! "$?" = "1" ]; then
      echo "No GitHub SSH key loaded exiting..."
      exit 1
    fi
  )
EOT
# this one download go modules
RUN --mount=type=bind,target=. \
    --mount=type=cache,target=/go/pkg/mod \
    --mount=type=ssh \
    go mod download -x

FROM vendor AS build
RUN --mount=type=bind,target=. \
    --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache \
    go build ...

Pour construire ce Dockerfile, vous devez spécifier un montage SSH que le constructeur peut utiliser dans les étapes avec --mount=type=ssh.

Le workflow GitHub Action suivant utilise l'action tierce MrSquaare/ssh-setup-action pour amorcer la configuration SSH sur le runner GitHub. L'action crée une clé privée définie par le secret GitHub Action SSH_GITHUB_PPK et l'ajoute au fichier socket de l'agent SSH à SSH_AUTH_SOCK. Le montage SSH dans l'étape de construction assume SSH_AUTH_SOCK par défaut, donc il n'est pas nécessaire de spécifier l'ID ou le chemin pour le socket de l'agent SSH explicitement.

name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up SSH
        uses: MrSquaare/ssh-setup-action@2d028b70b5e397cf8314c6eaea229a6c3e34977a # v3.1.0
        with:
          host: github.com
          private-key: ${{ secrets.SSH_GITHUB_PPK }}
          private-key-name: github-ppk

      - name: Build and push
        uses: docker/build-push-action@v6
        with:
          ssh: default
          push: true
          tags: user/app:latest
name: ci

on:
  push:

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - name: Set up SSH
        uses: MrSquaare/ssh-setup-action@2d028b70b5e397cf8314c6eaea229a6c3e34977a # v3.1.0
        with:
          host: github.com
          private-key: ${{ secrets.SSH_GITHUB_PPK }}
          private-key-name: github-ppk

      - name: Build
        uses: docker/bake-action@v6
        with:
          set: |
            *.ssh=default