【发布时间】:2015-09-21 11:53:33
【问题描述】:
我有一个 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 中的 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 运行)
【问题讨论】:
-
使用预定义的 env 变量生成 docker 文件对我来说似乎是最简单的方法。
-
你可能是对的。在没有更好的建议的情况下,我将整理一个 shell 脚本,该脚本将使用 sed 填充或注释掉硬编码的 NPM sed 设置,这样我就可以对云和企业主机使用相同的 Dockerfile。跨度>
-
更新:
docker-compose.yml版本 2 (docker 1.10+),您现在有一个更好的选择:build:/args:。见my answer below
标签: proxy docker docker-compose