在构建时将环境变量传递给Dockerfile

5

在构建时是否可以向Dockerfile传递环境变量,例如,在构建过程中安装一些需要验证才能获取的文件。


可能是在Docker中创建动态环境变量的重复问题。 - baxang
3个回答

4

这种方法可以实现你想要的功能,但不建议用于机密信息(机密信息很难处理)。

你可以使用构建参数。其思路是在Dockerfile中放置一个ARG指令,然后可以在Dockerfile内部引用它。

FROM alpine:3.3
ARG some-thing=<optional default value>

您可以稍后在Dockerfile中使用此变量,例如:
...
RUN echo $some-thing
...

当你构建镜像时,你可以将ARG传递给docker build命令,如下:

$ docker build --build-arg some-thing=some-value .

这将把“some-value”作为ARG“some-thing”传递到Docker构建过程中。

您将获得

echo $some-thing
"some-value"

你的ARG值不会在最终镜像中保留。所以你不必担心密码等机密信息泄露到最终镜像中。但是,Docker仍然不建议将其作为传递机密信息的一种方式。

4
不建议将机密信息存储在 Docker 中,因为命令将会出现在 Docker 历史记录中。 - ldg

0
如果你运行docker build --help,它会告诉你它接受哪些参数。如果你仔细查看,你会发现:
--build-arg=[]                  Set build-time variables

如果您无法弄清如何使用它,请参阅完整的Docker文档。

-1

Dockerfile提供了Entrypoint来实现这一点。您可以创建一个作为镜像入口点的shell脚本,该shell脚本可以将某些命令作为参数。

这里是我最近创建的一个示例。入口脚本将以SSH密钥对作为参数,在容器内部克隆私有git存储库。


但是所有这些东西都将被烤进镜像中吗?这不是答案。 - johnharris85
@JHarris 抱歉,我不明白你的意思。你能告诉我“all this stuff”的含义吗?是指脚本、参数还是其他东西? - Haoming Zhang
好的,那么,你并不是在做那个。我不太确定你在做什么。你的图像通过进行中间克隆来构建另一个图像。为什么我不只是在我的机器上克隆,然后在分发之前将代码复制进去呢? - johnharris85
@JHarris 你好,我的脚本是另一个项目的一部分,所以很难解释我在做什么。我只是用它作为一个例子,来展示Dockerfile的Entrypoint可以接受参数或环境变量。 - Haoming Zhang
Entrypoint 在容器中运行,而不是在镜像构建过程中运行。 - Ten Bitcomb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接