1

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

特别是在新的 docker build secret 信息中

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

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

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

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

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

FROM influxdb:2.0
ENV DOCKER_INFLUXDB_INIT_MODE=setup
ENV DOCKER_INFLUXDB_INIT_USERNAME=admin
ENV DOCKER_INFLUXDB_INIT_PASSWORD="mypassword"

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

提前致谢

4

1 回答 1

2

我如何使用 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

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

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


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

RUN curl -o /data/mydataset -u username:password \
  https://example.com/dataset

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

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

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

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

DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt -t myimage .
于 2021-03-03T12:30:34.453 回答