在 docker buildkit 中使用秘密标志的正确方法

red*_*aid 5 docker docker-buildkit

我正在努力解决加文在这个问题上提到的同样问题 。

特别是在新的docker 构建秘密信息

使用该功能的正确方法是什么?

在互联网上环顾四周,我只在上面提到的 docker 文档中发现了同一示例的一些变体,它在构建时打印了秘密。也许我没有完全理解这个例子,所以请帮助我。

如果无法在构建时获取机密并在 Dockerfile 的其他部分(例如 ARG 变量或 RUN 命令)中使用,那么何时以及如何使用该新功能来真正保证我的机密安全并完成工作?

我的目标是在构建时使用这个新功能,并保证我的秘密信息的安全,以防有人获取我的图像文件并在其上执行历史记录。

例如,我有一个像这样的 Dockerfile:

FROM influxdb:2.0
ENV DOCKER_INFLUXDB_INIT_MODE=setup
ENV DOCKER_INFLUXDB_INIT_USERNAME=admin
ENV DOCKER_INFLUXDB_INIT_PASSWORD="mypassword"
Run Code Online (Sandbox Code Playgroud)

例如,如何使用 docker 文档中提到的新功能来设置我的变量 (DOCKER_INFLUXDB_INIT_PASSWORD),使其不会记录在图像历史记录中?

提前致谢

lar*_*sks 8

例如,如何使用 docker 文档中提到的新功能来设置我的变量 (DOCKER_INFLUXDB_INIT_PASSWORD),使其不会记录在图像历史记录中?

这取决于您是否仅在构建时需要秘密,或者您是否确实想在运行时使用它。后一种情况可能更常见,并且已经有一个规范的解决方案:

如果您想排除DOCKER_INFLUXDB_INIT_PASSWORD图像历史记录,请不要在构建过程中设置它。要求它设置一个运行时,例如,通过-e VAR=VALUE参数docker run (或--env-file选项):

docker run -e DOCKER_INFLUXDB_INIT_PASSWORD=mypassword myimage
Run Code Online (Sandbox Code Playgroud)

您可以有一个ENTRYPOINT脚本在运行时检查变量,如果未设置变量,则退出并显示有用的错误消息。

MySQL 和 PostgreSQL 等官方 Docker 镜像就是这样工作的。


相反,构建机密适用于仅在构建时需要的机密。例如,假设您的构建过程需要执行以下操作:

RUN curl -o /data/mydataset -u username:password \
  https://example.com/dataset
Run Code Online (Sandbox Code Playgroud)

您想Dockerfile与其他人共享您的资源和相关资源,但不想共享您的用户名和密码。这就是构建机密的用武之地。您可以将身份验证信息粘贴在文件中,并修改您的Dockerfile以从机密中读取该信息:

RUN --mount=type=secret,id=mysecret \
  curl -o /data/mydataset -u $(cat /run/secrets/mysecret) \
  https://example.com/dataset
Run Code Online (Sandbox Code Playgroud)

在此示例中,一旦我们将远程文件复制到映像中,我们就完成了秘密:我们不需要它来从映像运行容器;仅在构建过程中需要它。

注意:上面假设您在构建时提供了文档中所述的秘密,因此您的构建命令可能类似于:

DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt -t myimage .
Run Code Online (Sandbox Code Playgroud)