it-swarm.dev

如何从docker-compose中为Docker RUN命令提供环境变量?

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

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

set | grep -i _proxy=>proxies.env

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

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

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

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

RUN set

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

docker exec -it myserver /bin/bash

然后运行set,我可以从proxies.env看到所有内容。

任何人都可以推荐一种方法,使这些变量在容器构建时可见,而不必对它们进行硬编码,这样我的docker-compose.yml和Dockerfile仍然适用于具有代理的主机和没有代理的主机?

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

12
Francis Norton

也许你可以试试这个:

在将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
3
armen.shimoon

更新2016,docker-compose 1.6.2,docker 1.10+,带 docker-compose.yml版本2

你现在有 args: sectionbuild:子节 ,它包含了非常有趣的可能性:

只有一个键的构建参数被解析为它们在机器上的环境值.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不包含任何硬编码的特定值。

30
VonC

可能是你的“环境”选项解决了你的问题。在你的docker中,compose文件看起来像:

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

docker-compose.yml

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

Dockerfilename__

ARG env

ENV NODE_ENV $env
2
Roman Rhrn Nesterov

这个例子修复了YUM。

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