将机密与 GitHub Actions 结合使用

生成密钥是在生成过程中使用的敏感信息,例如密码或 API 令牌。 Docker Build 支持两种形式的密钥:

  • Secret 挂载将 Secret 添加为生成容器中的文件 (在/run/secrets默认情况下)。
  • SSH 挂载将 SSH 代理套接字或密钥添加到构建容器中。

本页介绍如何将密钥与 GitHub Actions 结合使用。 有关密钥的一般介绍,请参阅构建密钥

秘密挂载

在以下示例中使用并公开了GITHUB_TOKEN秘密由 GitHub 在您的工作流程中提供。

首先,创建一个Dockerfile,它使用 secret:

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

在此示例中,密钥名称为github_token.以下工作流程 使用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 }}"            

注意

您还可以使用secret-files输入:

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

如果你使用的是 GitHub 机密并且需要处理多行值,则需要将键值对 引号之间:

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""}"  
钥匙价值
MYSECRET***********************
GIT_AUTH_TOKENabcdefghi,jklmno=0123456789
MYSECRETaaaaaaaa\nbbbbbbb\nccccccccc
FOObar
EMPTYLINEaaaa\n\nbbbb\nccc
JSON_SECRET{"key1":"value1","key2":"value2"}

注意

引号需要双转义。

SSH 挂载

SSH 挂载允许您使用 SSH 服务器进行身份验证。 例如,要执行git clone, 或从私有存储库获取应用程序包。

以下 Dockerfile 示例使用 SSH 挂载 从私有 GitHub 存储库获取 Go 模块。

# syntax=docker/dockerfile:1

ARG GO_VERSION="1.23"

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."git@github.com:".insteadOf "https://github.com/"
  (
    set +e
    ssh -T git@github.com
    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 ...

要构建此 Dockerfile,您必须指定构建器可以 在步骤中使用--mount=type=ssh.

以下 GitHub Action 工作流程使用MrSquaare/ssh-setup-action在 GitHub 运行器上引导 SSH 设置的第三方作。作 创建由 GitHub Action 密钥定义的私钥SSH_GITHUB_PPK和 将其添加到 SSH 代理套接字文件中,路径为SSH_AUTH_SOCK.SSH 挂载在 构建步骤假设SSH_AUTH_SOCK,因此无需指定 显式 SSH 代理套接字的 ID 或路径。


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: Checkout
        uses: actions/checkout@v4

      - 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