Docker如何在构build期间将主机ENV注入到Dockerfile ENV中?

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

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

 RUN echo $WEBSERVER_PRIVATE_KEY > /somewhere/key 

但它没有工作。

我看了一下ENV命令,但似乎没有办法注入这个值。

我看了一下ARG命令,但是它需要以--build-argforms传递,我怀疑它会在Docker回购时生效。

在自动构build期间,请参阅Docker回购的环境设置,如何让Dockerfile在设置中引用WEBSERVER_PRIVATE_KEY

在这里输入图像说明

你可以在select性环境variables上做到这一点,但是你需要通过--build-arg来传递它们,并且configuration你的Dockerfile来接收它们。 如果您没有为variables赋予--build-arg值或docker run -e的环境variables值,Docker将使用您的环境来设置值。

以下是使用构build参数的示例Dockerfile:

 FROM busybox ARG DOCKER_HOST=${DOCKER_HOST:-""} ENV DOCKER_HOST=${DOCKER_HOST} CMD echo "DOCKER_HOST is ${DOCKER_HOST}" 

如果你做了你的构build并传递了--build-arg DOCKER_HOST--build-arg DOCKER_HOST会从你的环境中设置这个variables:

 $ 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的情况下进行构build,那么这个环境variables将不会被传递:

 $ 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

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

docker构build过程不会在您的本地环境中发生。 这就是为什么variables您的本地shellvariables不拾起。

当你docker build . ,你的Dockefile驻留的目录中的所有文件都被复制到docker守护进程主机(无论你的DOCKER_HOST指向什么地方)。 构build步骤发生在这一点上。 所以是的,你要么需要使用ARGS传递variables,要么将你的本地环境variables复制到一个文件中,作为构build上下文的一部分复制到docker主机中。

请记住使用.dockerignore指定不应复制到构build上下文的目录/文件。 这加快了远程Docker主机的编译时间。

对于Mac / Windows的Docker, DOCKER_HOST没有被定义,但是发生了相同的行为。 您的本地文件(构build上下文)build立在一个非常小的Linux上,如在Mac上运行的OS(Xhyve)。