【问题标题】:Pass environment variables to Dockerfile during build time在构建期间将环境变量传递给 Dockerfile
【发布时间】:2016-07-27 03:38:12
【问题描述】:

是否可以在构建时将环境变量传递给 dockerfile,例如,以便在构建期间安装一些需要身份验证才能获取的文件。

【问题讨论】:

标签: docker


【解决方案1】:

这种方法会达到你想要的,但不推荐用于秘密(秘密很难)。

您可以使用构建参数。这个想法是你在你的 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"

ARGs 的值保留在最终图像中。因此,您不必担心密码等泄漏到最终图像中。但是 Docker 仍然不推荐它作为传递秘密的方式。

【讨论】:

  • 不推荐用于机密的原因是这些命令最终会出现在 Docker 历史记录中。
【解决方案2】:

如果您运行docker build --help,它会告诉您它接受哪些参数。如果你仔细看,你会发现:

--build-arg=[]                  Set build-time variables

如果您不知道如何使用它,请查阅完整的 Docker 文档。

【讨论】:

    【解决方案3】:

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

    Here 是我最近创建的一个示例。 entrypoint script 将使用 SSH 密钥对作为参数,以克隆容器内的私有 git 存储库。

    【讨论】:

    • 但是所有这些东西都会在图像中烘焙?这不是答案。
    • @JHarris 对不起,我不明白你的意思。你能告诉我“所有这些东西”的含义吗?脚本或参数或其他东西?
    • 好的,所以,您并没有完全这样做。我不确定你在做什么。您的图像通过执行中间克隆来构建另一个图像。为什么我不能在我的机器上克隆然后在分发之前复制代码?
    • @JHarris 嗨,我的脚本是另一个项目的一部分,所以很难解释我在做什么。我只是举个例子,说明Dockerfile的Entrypoint可以带参数或者环境变量。
    • 入口点在容器中运行,而不是在镜像的构建过程中。
    猜你喜欢
    • 2018-04-22
    • 2020-01-05
    • 2018-04-27
    • 2018-01-08
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2023-02-12
    • 2020-07-26
    相关资源
    最近更新 更多