如何处理docker工人的环境差异?

我认识到docker是为了减less将应用程序从一个环境转移到另一个环境的摩擦,在很多情况下,像运行时重写环境variables一样很容易。

考虑一种情况,即所有开发发生在公司代理之后,但是图像(或容器或Docker文件)需要被运送到具有不同架构要求的不同环境。 我想到的具体情况是开发环境包括一个非常有侵略性的公司代理。 图像需要(为了实现)在互联网上打服务的能力,所以正在开发的工作Dockerfile看起来像这样:

FROM centos ENV http_proxy=my.proxy.url \ https_proxy=my.proxy.url \ # these lines required for the proxy to be trusted, most apps block it otherwise b/c SSL inspection COPY ./certs/*.pem /etc/pki/ca-trust/source/anchors/ RUN /usr/bin/bupdate-ca-trust extract ## more stuff to actually run the app, etc 

在生产环境中,没有代理,也不需要提取pem文件。 我认识到,我可以设置环境variables在运行时不使用代理(或者相反,只在开发过程中设置它们),但是对于我所期望的Docker的准封装来说,这两种方式对我来说都是非常泄漏的。

我也认识到这个特殊的例子,复制和提取不会在生产中使用的pem文件并不是什么大事,但是这让我怀疑这个领域的最佳实践,因为我确信这不是什么唯一的例子。

理想情况下,我想让主机pipe理代理需求(实际上是任何环境差异),但是除了通过修改环境variables,我还没有find办法做到这一点。

您可以在开发机器上使用iptables将stream量从容器代理到代理。 然后,您的映像在每个运行环境中都是相同的,networking差异将由主机pipe理。 有关更多信息,请参阅http://silarsis.blogspot.nl/2014/03/proxy-all-containers.html

海事组织我不会太担心,如果它的工作。 图像仍然在每个环境中运行,所以除了语义之外,你并不是真正的“放弃”

您可以在Docker Engine级别上使用以下位置的指令进行configuration: https : //docs.docker.com/engine/admin/systemd/#httphttps-proxy

为docker服务创build一个systemd的放置目录:

 $ mkdir -p /etc/systemd/system/docker.service.d 

创build一个名为/etc/systemd/system/docker.service.d/http-proxy.conf的文件,添加HTTP_PROXY环境variables:

 [Service] Environment="HTTP_PROXY=http://proxy.example.com:80/" 

或者,如果您位于HTTPS代理服务器的后面,请创build一个名为/etc/systemd/system/docker.service.d/https-proxy.conf的文件,其中添加了HTTPS_PROXY环境variables:

 [Service] Environment="HTTPS_PROXY=https://proxy.example.com:443/" 

如果您有内部的Dockerregistry,您需要联系而无需代理,则可以通过NO_PROXY环境variables指定它们:

 Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com" 

或者,如果您位于HTTPS代理服务器的后面:

 Environment="HTTPS_PROXY=https://proxy.example.com:443/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com" 

冲洗更改:

 $ sudo systemctl daemon-reload Restart Docker: $ sudo systemctl restart docker 

validationconfiguration已经加载:

 $ systemctl show --property=Environment docker Environment=HTTP_PROXY=http://proxy.example.com:80/ 

或者,如果您位于HTTPS代理服务器的后面:

 $ systemctl show --property=Environment docker Environment=HTTPS_PROXY=https://proxy.example.com:443/