将机密与 GitHub Actions 结合使用
目录
生成密钥是在生成过程中使用的敏感信息,例如密码或 API 令牌。 Docker Build 支持两种形式的密钥:
本页介绍如何将密钥与 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_TOKEN | abcdefghi,jklmno=0123456789 |
MYSECRET | aaaaaaaa\nbbbbbbb\nccccccccc |
FOO | bar |
EMPTYLINE | aaaa\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