如何使docker-compose中的Docker RUN命令可用的环境variables?

我有一个Dockerised应用程序,我想在代理和非代理主机环境中运行。 我试图通过将正常的环境variables,如http_proxy,复制到容器中,当且仅当它们存在于主机中来解决这个问题。

我可以通过跑步获得90%的路程

set | grep -i _proxy=>proxies.env 

在顶层脚本中,然后在我的docker-compose.yml中:

 myserver: build: ./myserver env_file: - proxies.env 

这会将主机的环境代理variables(如果有的话)复制到服务器容器中,并且它的工作原理是这些variables在容器运行时可用,换句话说就是Dockerfile CMD或进入点执行的阶段。

然而,我有一个容器,需要运行npm作为构build步骤,即从Dockerfile中的RUN命令,这些variables似乎不存在于此阶段,所以npm找不到代理并挂起。 在其他作品,如果我有

 RUN set 

在我的Dockerfile中,我看不到来自proxies.env的任何variables,但如果我这样做

 docker exec -it myserver /bin/bash 

然后运行设置,我可以看到从proxies.env的一切。

任何人都可以推荐一种方法来使这些variables在容器的构build时间可见,而不必硬编码它们,这样我的docker-compose.yml和Dockerfile仍然可以为代理服务器和没有代理服务器的主机工作?

(运行centos 7,docker-compose 1.3.1和docker 1.7.0)

也许你可以试试这个:

在调用RUN之前,将.env文件添加到图像中

 ADD proxies.env proxies.env 

然后以你的RUN语句为前缀:

 RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR" 

这会产生以下输出:

 root@armenubuntudev:~/Dockers/set-env# docker build -t ashimoon/envtest . Sending build context to Docker daemon 3.584 kB Sending build context to Docker daemon Step 0 : FROM ubuntu ---> 91e54dfb1179 Step 1 : ADD proxies.env proxies.env ---> Using cache ---> 181d0e082e65 Step 2 : RUN export `cat proxies.env` && echo "FOO is $FOO and BAR is $BAR" ---> Running in 30426910a450 FOO is 1 and BAR is 2 ---> 5d88fcac522c Removing intermediate container 30426910a450 Successfully built 5d88fcac522c 

更新2016年,docker-compose 1.6.2,docker 1.10+,使用docker docker-compose.yml版本2 :

你现在有了args: build: section的 子 部分 ,其中包含了非常有趣的可能性:

只有一个键的构build参数在计算机上被parsing为其环境值Compose正在运行

参见PR 2653 (2016年1月)

因此,引入代理variables而不用docker-compose.yml文件中对它们进行硬编码的方法就是使用精确的语法:

 version: '2' services: myservice: build: context: . args: - http_proxy - https_proxy - no_proxy 

在调用docker-compose之前,您需要确保您的代理环境variables已设置:

 export http_proxy=http://username:password@proxy.com:port export https_proxy=http://username:password@proxy.com:port export no_proxy=localhost,127.0.0.1,company.com docker-compose up 

然后,由Dockerfile docker-compose进程构build的Dockerfile将自动获取代理variables值,即使docker-compose.yml不包含任何硬编码的特定值。

可能是你的“环境”选项解决你的问题。 在您的泊坞窗撰写文件将看起来像:

 myserver: build: ./myserver environment: - HTTP_PROXY=192.168.1.8 - VARIABLE=value - ... 

docker-compose.yml

 ... server: build: . args: env: $ENV ... 

Dockerfile

 ARG env ENV NODE_ENV $env 

这个例子修复了YUM。

 version: '2' services: example-service: build: context: . args: http_proxy: proxy.example.com:80