我有一个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泊坞窗)
使用预定义的env变量生成docker文件对我来说似乎是最简单的方式。 –
你可能是对的。如果没有更好的建议,我会整理一个shell脚本,它将使用sed来填充或注释硬编码的NPM sed设置,因此我可以为云和公司主机使用相同的Dockerfile。 –
更新:使用'docker-compose.yml'版本2(docker 1.10+),你现在有一个更好的选择:'build:/ args:'。看看[我的回答如下](http://stackoverflow.com/a/36084324/6309) – VonC