如何使来自 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
我有一个 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