Docker如何在构建过程中将主机环境变量注入到Dockerfile的环境变量中?

9
我正在为Docker仓库的自动构建添加一些环境设置,比如说WEBSERVER_PRIVATE_KEY=123
在我的Dockerfile中,当我本地构建时,我假设它会获取到环境变量的值。
RUN echo $WEBSERVER_PRIVATE_KEY > /somewhere/key

但它没起作用。
我查看了ENV命令,但似乎没有办法注入该值。
我看了一下ARG命令,但它需要作为--build-arg传递,我怀疑它在docker repo上构建时是否有效。
请参见下面的docker repo环境设置,如何使Dockerfile引用设置中的WEBSERVER_PRIVATE_KEYenter image description here

可能是重复的问题 在 Dockerfile 中获取环境变量的值 - Issam El-atif
我看过那个,但我不确定它是否是重复的,我也不确定Docker的构建是否会将存储库设置中的环境值作为构建参数传递。 - James Lin
这是Docker Cloud还是Docker Trusted Registry? - Elton Stoneman
这是Docker Cloud。 - James Lin
2个回答

13
你可以在选择性的环境变量上这样做,但是你需要通过--build-arg传递它们,并配置你的Dockerfile来接收它们。当你没有为变量提供--build-arg值,或者在运行时没有使用docker run -e为环境变量提供值时,Docker将使用你的环境来设置该值。
下面是一个使用构建参数的示例Dockerfile:
FROM busybox

ARG DOCKER_HOST=${DOCKER_HOST:-""}
ENV DOCKER_HOST=${DOCKER_HOST}

CMD echo "DOCKER_HOST is ${DOCKER_HOST}"

如果你进行构建并通过 --build-arg DOCKER_HOST,docker 将会从你的环境中设置该变量:
$ echo $DOCKER_HOST
127.0.0.1:2376

$ docker build --build-arg DOCKER_HOST -t test-env:latest .
...
Successfully built 088fabdd9a96

$ docker run test-env
DOCKER_HOST is 127.0.0.1:2376

如果没有使用该参数进行构建,则该环境变量不会被传递:
$ docker build -t test-env:latest .
...
Successfully built ef31d886749b

$ docker run test-env
DOCKER_HOST is

但是你仍然可以在docker run -e DOCKER_HOST命令中手动传递它到你的环境中:

$ docker run -e DOCKER_HOST test-env
DOCKER_HOST is 127.0.0.1:2376

这个回答让我在困惑了一天之后恍然大悟。谢谢@Bmitch。 - ali

2
Docker构建过程不在您的本地环境中进行。这就是为什么您的本地shell变量不被捕获的原因。
当您执行docker build .命令时,您的Dockefile所在目录中的所有文件都会被复制到Docker守护程序主机(无论您的DOCKER_HOST指向何处)。构建步骤在此时发生。因此,是的,您需要使用ARGS传递变量,或将本地环境变量复制到一个文件中,该文件将作为构建上下文的一部分复制到Docker主机。
请记住要使用.dockerignore指定不应复制到构建上下文中的目录/文件。这可以加快远程Docker主机的构建时间。
对于Docker for Mac / Windows,未定义DOCKER_HOST,但具有相同的行为。您的本地文件(构建上下文)是在运行在Mac上的类似Linux的小型操作系统(Xhyve)上构建的。

我完全意识到这是我的本地环境,我的问题是当我在docker上添加环境设置时。 - James Lin
抱歉,我不太明白你的评论。你是在问如何将环境变量添加到主机中,以便从上下文中进行构建吗? - Bernard

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