如何使来自 docker-compose 的 Docker 运行 命令可以使用环境变量?

How to make environmental variables available to Docker RUN commands from docker-compose?

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

运行宁

我可以完成 90% 的路程
set | grep -i _proxy=>proxies.env

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

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

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

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

RUN set

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

docker exec -it myserver /bin/bash

然后运行设置,我可以从proxies.env.

看到一切

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

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

可能是您 "environment" 选项解决了您的问题。在您的 docker 撰写文件中看起来像:

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

也许你可以试试这个:

在调用 RUN 之前,ADD .env 文件进入图像

ADD proxies.env proxies.env

然后在您的 运行 语句前加上前缀:

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-compose.yml version 2:

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

Build arguments with only a key are resolved to their environment value on the machine Compose is running on.

参见 PR 2653(2016 年 1 月)

因此,在 docker-compose.yml 文件本身中引入代理变量 而无需对它们进行硬编码 的方法就是使用这种精确的语法:

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

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

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

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

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