2015-07-03 97 views
12

我有一个Dockerised应用程序,我想在代理和非代理主机环境中运行。我试图通过将正常环境变量(如http_proxy)复制到容器当中并且仅当它们存在于主机中时解决此问题。如何让docker-compose中的Docker RUN命令可以使用环境变量?

我可以通过在顶层脚本运行

set | grep -i _proxy=>proxies.env 

,再有,在我的搬运工,compose.yml获得90%的方式出现:

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

此副本主机的环境代理变量(如果有的话)放入服务器容器中,它的工作原理是这些变量在容器运行时可用,换句话说就是Dockerfile CMD或ENTRYPOINT执行的阶段。

但是我有一个容器,需要运行npm作为构建步骤,即从Dockerfile中的RUN命令,并且这些变量似乎不存在于此阶段,因此npm无法找到代理并挂起。在其他的作品,如果我在Dockerfile有

RUN set 

,我不能看到任何proxies.env变量,但如果我不

docker exec -it myserver /bin/bash 

然后运行设置,我所看到的一切来自proxies.env。

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

(在CentOS 7运行,码头工人,组成1.3.1和1.7.0泊坞窗)

+0

使用预定义的env变量生成docker文件对我来说似乎是最简单的方式。 –

+0

你可能是对的。如果没有更好的建议,我会整理一个shell脚本,它将使用sed来填充或注释硬编码的NPM sed设置,因此我可以为云和公司主机使用相同的Dockerfile。 –

+2

更新:使用'docker-compose.yml'版本2(docker 1.10+),你现在有一个更好的选择:'build:/ args:'。看看[我的回答如下](http://stackoverflow.com/a/36084324/6309) – VonC

回答

3

也许你可以试试这个:

你打电话RUNADD之前.ENV文件转换成图像

ADD proxies.env proxies.env 

那么你的前缀RUN声明:

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

这产生以下输出:

[email protected]:~/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 
+0

ENV ENV JAVA_HOME $(alternatives --list | grep javac | awk'{print $ 3}'| sed -e“s/\/bin \/javac // g”)???? –

+0

这为我解决了这个问题 - 它使得构建时的env变量可用于容器 – FeifanZ

+1

这个答案解决了这个问题,只是注意到这打破了创建“码头图像”的哲学...... – nanounanue

4

可能是你的“环境”选项解决您的问题。在您的码头工人撰写的文件将是这样的:

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

请问yml的版本是什么? –

25

更新2016年,搬运工,组成1.6.2,搬运工1.10+,具有docker-compose.yml version 2

您现在有build: sectionargs: sub-section,其中包括非常有趣的可能性:

仅使用一个键的构建参数将在计算机上解析为它们的环境值Compose正在上运行。

PR 2653(2016年1月)

其结果是,一个方式介绍代理变量没有硬编码它们docker-compose.yml文件本身是与精确的语法:

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

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

export http_proxy=http://username:[email protected]:port 
export https_proxy=http://username:[email protected]:port 
export no_proxy=localhost,127.0.0.1,company.com 

docker-compose up 

然后由docker-compose进程构建的Dockerfile进程将自动提取代理变量值,即使docker-compose.yml未包含任何硬编码的特定值。

+1

如果主机env无法提供构建参数并且未通过cli提供,会发生什么情况? – Aznim

1

docker-compose.yml

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

Dockerfile

ARG env 

ENV NODE_ENV $env 
+0

这是最好的答案。 – noun

0

此示例修复YUM。

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