建立秘密
构建机密是作为应用程序构建过程的一部分使用的任何敏感信息,例如密码或 API 令牌。
构建参数和环境变量不适合将机密传递给构建,因为它们会保留在最终映像中。相反,应该使用秘密挂载或 SSH 挂载,这可以安全地向您的构建公开秘密。
秘密坐骑
秘密挂载将秘密作为文件公开给构建容器。您
将机密安装到需要访问它们的RUN
指令,类似于定义绑定安装或缓存安装的方式。
RUN --mount=type=secret,id=mytoken \
TOKEN=$(cat /run/secrets/mytoken) ...
要将秘密传递给构建,请使用
docker build --secret
flag或
Bake的等效选项。
$ docker build --secret id=mytoken,src=$HOME/.aws/credentials .
variable "HOME" {
default = null
}
target "default" {
secret = [
"id=mytoken,src=${HOME}/.aws/credentials"
]
}
来源
秘密的来源可以是
文件或
环境变量。当您使用 CLI 或 Bake 时,可以自动检测类型。您还可以使用type=file
或显式指定它type=env
。
以下示例将环境变量安装KUBECONFIG
到 Secret ID kube
,作为位于 的构建容器中的文件/run/secrets/kube
。
$ docker build --secret id=kube,env=KUBECONFIG .
当您从环境变量中获取机密时,可以省略该env
参数以将机密绑定到与变量同名的文件。在以下示例中,变量的值API_TOKEN
被安装到/run/secrets/API_TOKEN
构建容器中。
$ docker build --secret id=API_TOKEN .
目标
默认情况下,机密被安装到/run/secrets/<id>
.您可以使用target
Dockerfile 中的选项自定义构建容器中的挂载点。
以下示例将密钥安装到/root/.aws/credentials
构建容器中的文件中。
$ docker build --secret id=aws,src=/root/.aws/credentials .
RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \
aws s3 cp ...
SSH挂载
如果您要在构建中使用的凭据是 SSH 代理套接字或密钥,则可以使用 SSH 挂载而不是秘密挂载。克隆私有 Git 存储库是 SSH 安装的常见用例。
以下示例使用 Dockerfile SSH mount克隆私有 GitHub 存储库。
# syntax=docker/dockerfile:1
FROM alpine
ADD git@github.com:me/myprivaterepo.git /src/
要将 SSH 套接字传递给构建,您可以使用
docker build --ssh
flag或
Bake的等效选项。
$ docker buildx build --ssh default .
远程上下文的 Git 身份验证
BuildKit 支持两个预定义的构建秘密,GIT_AUTH_TOKEN
以及
GIT_AUTH_HEADER
.使用它们在使用远程私有 Git 存储库构建时指定 HTTP 身份验证参数,包括:
- 使用私有 Git 存储库作为构建上下文进行构建
- 在构建中获取私有 Git 存储库
ADD
例如,假设您在 上有一个私有 GitLab 项目
https://gitlab.com/example/todo-app.git
,并且您希望使用该存储库作为构建上下文来运行构建。未经身份验证的docker build
命令会失败,因为构建器无权提取存储库:
$ docker build https://gitlab.com/example/todo-app.git
[+] Building 0.4s (1/1) FINISHED
=> ERROR [internal] load git source https://gitlab.com/dvdk/todo-app.git
------
> [internal] load git source https://gitlab.com/dvdk/todo-app.git:
0.313 fatal: could not read Username for 'https://gitlab.com': terminal prompts disabled
------
要向 Git 服务器验证构建器,请设置GIT_AUTH_TOKEN
环境变量以包含有效的 GitLab 访问令牌,并将其作为机密传递给构建:
$ GIT_AUTH_TOKEN=$(cat gitlab-token.txt) docker build \
--secret id=GIT_AUTH_TOKEN \
https://gitlab.com/example/todo-app.git
它还GIT_AUTH_TOKEN
可以ADD
在构建过程中获取私有 Git 存储库:
FROM alpine
ADD https://gitlab.com/example/todo-app.git /src
HTTP认证方案
默认情况下,通过 HTTP 的 Git 身份验证使用 Bearer 身份验证方案:
Authorization: Bearer <GIT_AUTH_TOKEN>
如果您需要使用带有用户名和密码的基本方案,您可以设置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 方案。
多主机
您可以为每个主机设置GIT_AUTH_TOKEN
和密钥,这样您就可以对不同的主机名使用不同的身份验证参数。GIT_AUTH_HEADER
要指定主机名,请将主机名作为后缀附加到机密 ID 后:
$ 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