Docker如何在构建期间将主机ENV注入Dockerfile ENV?

时间:2016-10-06 23:10:23

标签: docker

我在docker repo自动构建中添加了一些环境设置,比方说,WEBSERVER_PRIVATE_KEY=123

在我的Dockerfile中,当我在本地构建时,我认为它会获取env值

RUN echo $WEBSERVER_PRIVATE_KEY > /somewhere/key

但它不起作用。

我查看了ENV命令,但似乎没有办法注入该值。

我查看了ARG命令,但它需要传递为--build-arg我怀疑它在构建的docker repo期间是否有效。

在自动构建期间,请参阅以下有关docker repo的环境设置,如何使Dockerfile在设置中引用WEBSERVER_PRIVATE_KEY

enter image description here

2 个答案:

答案 0 :(得分:5)

您可以在选择性环境变量上执行此操作,但需要使用--build-arg传递它们并配置Dockerfile以接收它们。如果您没有为变量赋予--build-arg值,或者在运行时为环境变量赋值docker run -e,则Docker将使用您的环境来设置值。

这是一个使用build-args的示例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

如果在没有arg的情况下进行构建,则不会传递该环境变量:

$ 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

答案 1 :(得分:0)

docker构建过程不会在您的本地环境中发生。这就是为什么变量你的本地shell变量没有被选中的原因。

当您docker build .时,您的Dockefile所在的目录中的所有文件都会被复制到docker守护程序主机(无论您的DOCKER_HOST指向哪个)。构建步骤就在那时发生。所以是的,您需要使用ARGS传递变量,或者将本地环境变量复制到一个文件中,该文件将作为构建上下文的一部分复制到docker主机。

请记住使用.dockerignore指定不应复制到构建上下文的目录/文件。这可以加快专门为远程docker主机构建的时间。

对于适用于Mac / Windows的Docker,未定义DOCKER_HOST,但会发生相同的行为。您的本地文件(构建上下文)构建在Mac上运行的非常小的Linux操作系统(Xhyve)上。