我有一个Docker化的应用程序,我希望在代理和非代理主机环境中都能运行。我正在尝试通过在容器中复制普通环境变量(例如http_proxy),仅在主机中存在时才进行复制,以解决此问题。
通过运行以下命令,我可以完成90%的工作:
set | grep -i _proxy=>proxies.env
在一个顶层脚本中编写,然后在我的docker-compose.yml文件中包含:
myserver:
build: ./myserver
env_file:
- proxies.env
如果有主机的环境代理变量,该命令会将这些变量复制到服务器容器中,并且这些变量在容器运行时可用。换句话说,在Dockerfile CMD或ENTRYPOINT执行阶段时,这些变量是存在的。
然而,我有一个容器需要在Dockerfile中通过RUN命令运行npm构建步骤,但是似乎在此阶段这些变量并不存在,因此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下运行)
docker-compose.yml
版本 2(docker 1.10+),现在您有更好的选择:build:/args:
。请参见我的答案。 - VonC