Docker:在构建阶段,访问本地文件

时间:2019-08-01 13:51:23

标签: docker

是否可以编写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中有没有办法做到这一点?

1 个答案:

答案 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
$