在 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 .
我正在努力解决 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 .