--- title: Using secrets with GitHub Actions description: Example using secret mounts with GitHub Actions keywords: ci, github actions, gha, buildkit, buildx, secret tags: [Secrets] --- A build secret is sensitive information, such as a password or API token, consumed as part of the build process. Docker Build supports two forms of secrets: - [Secret mounts](#secret-mounts) add secrets as files in the build container (under `/run/secrets` by default). - [SSH mounts](#ssh-mounts) add SSH agent sockets or keys into the build container. This page shows how to use secrets with GitHub Actions. For an introduction to secrets in general, see [Build secrets](../../building/secrets.md). ## Secret mounts In the following example uses and exposes the [`GITHUB_TOKEN` secret](https://docs.github.com/en/actions/security-guides/automatic-token-authentication#about-the-github_token-secret) as provided by GitHub in your workflow. First, create a `Dockerfile` that uses the secret: ```dockerfile # syntax=docker/dockerfile:1 FROM alpine RUN --mount=type=secret,id=github_token \ cat /run/secrets/github_token ``` In this example, the secret name is `github_token`. The following workflow exposes this secret using the `secrets` input: ```yaml name: ci on: push: jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - 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: context: . platforms: linux/amd64,linux/arm64 tags: user/app:latest secrets: | "github_token=${{ secrets.GITHUB_TOKEN }}" ``` > **Note** > > You can also expose a secret file to the build with the `secret-files` input: > > ```yaml > secret-files: | > "MY_SECRET=./secret.txt" > ``` If you're using [GitHub secrets](https://docs.github.com/en/actions/security-guides/encrypted-secrets) and need to handle multi-line value, you will need to place the key-value pair between quotes: ```yaml 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""}" ``` | Key | Value | | ---------------- | ----------------------------------- | | `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** > > Double escapes are needed for quote signs. ## SSH mounts SSH mounts let you authenticate with SSH servers. For example to perform a `git clone`, or to fetch application packages from a private repository. The following Dockerfile example uses an SSH mount to fetch Go modules from a private GitHub repository. ```dockerfile {collapse=1} # syntax=docker/dockerfile:1 ARG GO_VERSION="{{% param example_go_version %}}" 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 <}} {{< tab name="`docker/build-push-action`" >}} ```yaml name: ci on: push: jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - 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: context: . ssh: default push: true tags: user/app:latest ``` {{< /tab >}} {{< tab name="`docker/bake-action`" >}} ```yaml name: ci on: push: jobs: docker: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - 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@v5 with: set: | *.ssh=default ``` {{< /tab >}} {{< /tabs >}}