是否可以编写dockerfile以便在构建阶段可以访问本地文件中的信息?我不是要挂载此文件,而是在不指定变量参数的情况下尝试访问其内容。
例如,以下情况不适用于我的情况:
// in the docker file
ARG my_variable
RUN echo "${my_variable}" > /tmp/whatever
// docker command
docker build --build-arg my_variable="$(cat /tmp/whatever)" ...
为什么?假设我有任意数量的文件,并且需要定义任意数量的参数变量,所有这些变量都必须进行硬编码:因此,出现了问题。
相反,能够执行以下操作将很有用:
// in the dockerfile, in psuedo code, where I am symbolizing
// access of the host os shell with double backticks
VAR my_variable=``$(cat some_file)``
// then, perhaps later
VAR my_variable=``$(cat some_other_file)``
在docker中有没有办法做到这一点?
答案 0 :(得分:1)
所以我试图在一个中间构建阶段中存储ssh密钥,在该阶段中我可能有一个ssh密钥用于x,另一个有ysh,等等...我认为将文件简单地添加到中间层是否安全构建,建议将密钥存储为参数变量的答案不会很多
如果您的目标只是想在做docker build
和其他not want to keep them in built out docker image
时添加一些秘密内容,那么我认为这些建议使用args的答案现在已经过时了。
您可以使用Docker Build secret information,另请参见this:
RUN --mount = type = secret
这种安装类型允许构建容器访问安全文件(例如私钥)而无需将其烘焙到映像中。
接下来的一个最小示例:
Dockerfile:
# syntax=docker/dockerfile:experimental
FROM alpine
RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar
RUN --mount=type=secret,id=mysecret2,dst=/foobar2 cat /foobar2
mysecret.txt:
HEREHEREHEREHERE111111111111111111111111111111111111
mysecret2.txt:
THERETHERETHERE2222222222222222222222222222222222222
构建命令:
$ DOCKER_BUILDKIT=1 docker build --no-cache --progress=plain --secret id=mysecret,src=mysecret.txt --secret id=mysecret2,src=mysecret2.txt -t abc:1 .
构建日志:
#1 [internal] load build definition from Dockerfile
......
#9 [2/3] RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar
#9 digest: sha256:f9c85b682995c7282a89e769894571de46aa2fd3b433168e36f1f2a7f90322fe
#9 name: "[2/3] RUN --mount=type=secret,id=mysecret,dst=/foobar cat /foobar"
#9 started: 2019-08-02 03:22:43.288232033 +0000 UTC
#9 0.919 HEREHEREHEREHERE111111111111111111111111111111111111
#9 completed: 2019-08-02 03:22:45.467111192 +0000 UTC
#9 duration: 2.178879159s
#10 [3/3] RUN --mount=type=secret,id=mysecret2,dst=/foobar2 cat /foobar2
#10 digest: sha256:76e3ae52c6222cd45683599f634c126345e90eb0161dd87b7e74bd09e9bf2361
#10 name: "[3/3] RUN --mount=type=secret,id=mysecret2,dst=/foobar2 cat /foobar2"
#10 started: 2019-08-02 03:22:45.551609323 +0000 UTC
#10 1.313 THERETHERETHERE2222222222222222222222222222222222222
#10 completed: 2019-08-02 03:22:47.859417448 +0000 UTC
#10 duration: 2.307808125s
您可以看到Dockerfile
中已经使用了2个机密。并且在构建后确认,您无法从映像中获取任何秘密:
$ docker run --rm abc:1 cat /foobar
$ docker run --rm abc:1 cat /foobar2
$