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

Right way to use secret flag in docker buildkit

我正在努力解决 Gavin 在 this question.

特别是在新 docker build secret information

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

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

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

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

例如,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),例如,以一种不会记录在图像历史记录中的方式?

提前致谢

How can I use that new feature mentioned in docker documentation to set my variable (DOCKER_INFLUXDB_INIT_PASSWORD), for example, in a way that it will not logged in image history?

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

如果你想DOCKER_INFLUXDB_INIT_PASSWORD不在你的形象中 历史,只是不要在构建过程中设置它。要求它是 设置一个 运行 时间,例如,通过 -e VAR=VALUE 参数到 docker run (或 --env-file 选项):

docker run -e DOCKER_INFLUXDB_INIT_PASSWORD=mypassword myimage

你可以有一个 ENTRYPOINT 脚本来检查变量 运行时间并在未设置时退出并显示有用的错误消息。

官方 Docker 图片用于 MySQL 和 PostgreSQL 工作 这样。


相比之下,构建秘密仅适用于秘密 在构建时需要。例如,假设您的构建过程 需要做这样的事情:

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

在这个例子中,一旦我们将远程文件复制到图像中, 我们已经完成了秘密:我们不需要它来 运行 图像中的容器;它只在构建期间需要 过程。

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

DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=mysecret.txt -t myimage .