简短的回答
docker build
有--secret
API 版本 1.39+ 的选项。
长答案
API 版本 1.39+ 表示 docker 18.09.0+
在发行说明中,在18.09.0 的“Docker Engine EE 和 CE 的新功能”部分下说:
- 将 API 版本更新为 1.39 moby/moby#37640
指南中的“Build Enhancements for Docker”页面的解释有点过时。
我--secret
在New Docker Build secret information找到了选项,但这里的解释已经过时了。它说
这个 Dockerfile 只是为了证明秘密可以被访问。如您所见,构建输出中打印的秘密。最终构建的图像不会有秘密文件
但实际上秘密并没有打印在构建输出中。我认为这是出于安全考虑。
buildkit 中的“Dockerfile 前端实验语法”页面有最新的解释。
然后我找到了以下页面。
如何使用 docker build --secret
以下是要遵循的步骤。
- 确保使用所需版本的 docker。
$ docker version
Client: Docker Engine - Community
Version: 19.03.2
API version: 1.40
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:29:11 2019
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.2
API version: 1.40 (minimum version 1.12)
Go version: go1.12.8
Git commit: 6a30dfc
Built: Thu Aug 29 05:27:45 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683
- 将
DOCKER_BUILDKIT
环境变量设置为1
$ export DOCKER_BUILDKIT=1
- 创建一个秘密文件。
$ echo "It's a secret" > mysecret.txt
- 创建一个 Dockerfile。
$ cat <<EOF > Dockerfile
# syntax = docker/dockerfile:experimental
FROM alpine
RUN --mount=type=secret,id=mysecret,target=/foobar cat /foobar | tee /output
EOF
确保您# syntax = docker/dockerfile:experimental
在Dockerfile
. 请注意,上面的示例仅用于演示。实际使用时不要保存secret的内容。
docker build
使用--secret
选项运行。
$ docker build -t secret-example --secret id=mysecret,src=mysecret.txt .
[+] Building 2.3s (8/8) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 176B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> resolve image config for docker.io/docker/dockerfile:experimental
=> CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:888f21826273409b5ef5ff9ceb90c64a8f8ec7760da30d1ffbe6c3e2d323a7bd
=> [internal] load metadata for docker.io/library/alpine:latest
=> CACHED [1/2] FROM docker.io/library/alpine
=> [2/2] RUN --mount=type=secret,id=mysecret,target=/foobar cat /foobar | tee /output
=> exporting to image
=> => exporting layers
=> => writing image sha256:22c44473107b6d1f92095c6400613a7e82c9835f5baaa85853a114e4bb5d8744
=> => naming to docker.io/library/secret-example
请注意,mysecret.txt
即使在构建输出中也不会打印 的内容。
验证密钥是否正确使用。同样,这仅用于演示目的。
$ docker run -t secret-example cat /output
It's a secret
我注意到/foobar
没有保存的内容,但空文件保留在构建的图像中。
$ docker run -t secret-example ls -l /foobar
-rwxr-xr-x 1 root root 0 Sep 16 19:16 /foobar