构建密钥

构建密钥是任何敏感信息,例如密码或 API 令牌,作为应用程序构建过程的一部分使用。

生成参数和环境变量不适合传递机密 添加到您的构建中,因为它们会保留在最终镜像中。相反,您应该使用 secret 挂载或 SSH 挂载,它们安全地向构建公开 secret。

生成密钥的类型

  • 秘密挂载是用于传递的通用挂载 secrets 复制到您的构建中。Secret 挂载从 build 客户端获取 secret 并使其在 build 容器中临时可用,以便使用 build 指令的持续时间。例如,如果您的 build 需要与专用构件服务器或 API 通信。
  • SSH 挂载是用于制作 SSH 套接字的专用挂载 或 build 中可用的键。当您需要获取 私有 Git 存储库。
  • 远程上下文的 Git 身份验证是一组预定义的密钥,用于使用远程 Git 上下文进行构建 这也是一个私有仓库。这些密钥是 “pre-flight” 密钥: 它们不会在您的构建指令中使用,但它们已经习惯了 为生成器提供获取上下文所需的凭据。

使用生成密钥

对于 secret 挂载和 SSH 挂载,使用 build secret 是一个两步过程。 首先,您需要将 secret 传递到命令中,然后 需要使用 Dockerfile 中的 Secret。docker build

要将密钥传递给构建,请使用 docker build --secret 标志Bake 的等效选项。


$ docker build --secret id=aws,src=$HOME/.aws/credentials .
variable "HOME" {
  default = null
}

target "default" {
  secret = [
    "id=aws,src=${HOME}/.aws/credentials"
  ]
}

要在构建中使用密钥并使其可供指令访问, 在 Dockerfile 中使用 --mount=type=secret 标志。RUN

RUN --mount=type=secret,id=aws \
    AWS_SHARED_CREDENTIALS_FILE=/run/secrets/aws \
    aws s3 cp ...

秘密挂载

Secret 挂载将 Secret 作为文件或环境公开给构建容器 变量。您可以使用 secret 挂载将敏感信息传递给 内部版本,例如 API 令牌、密码或 SSH 密钥。

来源

密钥的源可以是文件环境变量。 当您使用 CLI 或 Bake 时,可以自动检测类型。您可以 还可以使用 or 显式指定它。type=filetype=env

以下示例将环境变量挂载到密钥 ID , 作为 Build Container 中位于 的文件。KUBECONFIGkube/run/secrets/kube

$ docker build --secret id=kube,env=KUBECONFIG .

当您使用环境变量中的 secret 时,您可以省略参数 将 secret 绑定到与变量同名的文件。 在以下示例中,变量 挂载到构建容器中。envAPI_TOKEN/run/secrets/API_TOKEN

$ docker build --secret id=API_TOKEN .

目标

在 Dockerfile 中使用 secret 时,secret 会通过 违约。密钥在构建容器内的默认文件路径为 .您可以自定义密钥在构建中的挂载方式 容器中的 Dockerfile 中。/run/secrets/<id>targetenvRUN --mount

以下示例采用密钥 ID 并将其挂载到构建容器中的文件中。aws/run/secrets/aws

RUN --mount=type=secret,id=aws \
    AWS_SHARED_CREDENTIALS_FILE=/run/secrets/aws \
    aws s3 cp ...

要将密钥挂载为具有不同名称的文件,请使用 国旗。target--mount

RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
    aws s3 cp ...

要将密钥挂载为环境变量而不是文件,请使用标志中的选项。env--mount

RUN --mount=type=secret,id=aws-key-id,env=AWS_ACCESS_KEY_ID \
    --mount=type=secret,id=aws-secret-key,env=AWS_SECRET_ACCESS_KEY \
    --mount=type=secret,id=aws-session-token,env=AWS_SESSION_TOKEN \
    aws s3 cp ...

可以同时使用 和 选项来挂载密钥 作为文件和环境变量。targetenv

SSH 挂载

如果要在构建中使用的凭证是 SSH 代理套接字或密钥, 您可以使用 SSH 挂载而不是秘密挂载。克隆私有 Git repositories 是 SSH 挂载的常见用例。

以下示例使用 Dockerfile 克隆私有 GitHub 存储库 SSH 挂载

# syntax=docker/dockerfile:1
FROM alpine
ADD git@github.com:me/myprivaterepo.git /src/

要将 SSH 套接字传递给构建,请使用 docker build --ssh 标志或等效标志 Bake 选项。

$ docker buildx build --ssh default .

远程上下文的 Git 身份验证

BuildKit 支持两个预定义的构建密钥,以及 .在以下情况下,使用它们指定 HTTP 身份验证参数 使用远程私有 Git 存储库进行构建,包括:GIT_AUTH_TOKENGIT_AUTH_HEADER

  • 使用私有 Git 存储库作为构建上下文进行构建
  • 使用ADD

例如,假设您在 有一个私有的 GitLab 项目,并且您希望使用 该存储库作为构建上下文。未经身份验证的命令 失败,因为生成器无权拉取存储库:https://gitlab.com/example/todo-app.gitdocker build

$ docker build https://gitlab.com/example/todo-app.git
[+] Building 0.4s (1/1) FINISHED
 => ERROR [internal] load git source https://gitlab.com/example/todo-app.git
------
 > [internal] load git source https://gitlab.com/example/todo-app.git:
0.313 fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
------

要向 Git 服务器验证构建器,请将环境变量设置为包含有效的极狐GitLab 访问令牌,并将其作为 构建的秘密:GIT_AUTH_TOKEN

$ GIT_AUTH_TOKEN=$(cat gitlab-token.txt) docker build \
  --secret id=GIT_AUTH_TOKEN \
  https://gitlab.com/example/todo-app.git

它还可用于获取私有 Git 存储库 构建的一部分:GIT_AUTH_TOKENADD

FROM alpine
ADD https://gitlab.com/example/todo-app.git /src

HTTP 身份验证方案

默认情况下,基于 HTTP 的 Git 身份验证使用 Bearer 身份验证方案:

Authorization: Bearer <GIT_AUTH_TOKEN>

如果需要使用 Basic 方案,可以使用用户名和密码,将 构建密钥:GIT_AUTH_HEADER

$ export GIT_AUTH_TOKEN=$(cat gitlab-token.txt)
$ export GIT_AUTH_HEADER=basic
$ docker build \
  --secret id=GIT_AUTH_TOKEN \
  --secret id=GIT_AUTH_HEADER \
  https://gitlab.com/example/todo-app.git

BuildKit 目前仅支持 Bearer 和 Basic 方案。

多个主机

您可以在每个主机上设置 and 密钥 基础,这允许您对不同的 hostnames 的 Hostnames 中。要指定主机名,请将主机名作为后缀附加到密钥 编号:GIT_AUTH_TOKENGIT_AUTH_HEADER

$ export GITLAB_TOKEN=$(cat gitlab-token.txt)
$ export GERRIT_TOKEN=$(cat gerrit-username-password.txt)
$ export GERRIT_SCHEME=basic
$ docker build \
  --secret id=GIT_AUTH_TOKEN.gitlab.com,env=GITLAB_TOKEN \
  --secret id=GIT_AUTH_TOKEN.gerrit.internal.example,env=GERRIT_TOKEN \
  --secret id=GIT_AUTH_HEADER.gerrit.internal.example,env=GERRIT_SCHEME \
  https://gitlab.com/example/todo-app.git