我在公司代理后面使用 Drone。当我在那里构建 Docker 容器时,Docker 将正确的搜索服务器以及 DNS 地址插入到容器的/etc/resolv.conf
. 然而,当使用Docker 插件时,只有搜索服务器被修补,而名称服务器被设置为默认的谷歌名称服务器(8.8.8.8
resp. 8.8.4.4
)。
这显然破坏了我的构建,因为我的公司代理 DNS 地址无法解析为其关联的 IP 地址。
这种行为是有意的和/或是否有一种解决方法允许我通过代理连接到互联网?
我在公司代理后面使用 Drone。当我在那里构建 Docker 容器时,Docker 将正确的搜索服务器以及 DNS 地址插入到容器的/etc/resolv.conf
. 然而,当使用Docker 插件时,只有搜索服务器被修补,而名称服务器被设置为默认的谷歌名称服务器(8.8.8.8
resp. 8.8.4.4
)。
这显然破坏了我的构建,因为我的公司代理 DNS 地址无法解析为其关联的 IP 地址。
这种行为是有意的和/或是否有一种解决方法允许我通过代理连接到互联网?
这可以通过为 docker 插件配置提供您的 DNS 服务器地址来解决。请注意,下面的示例使用虚拟 IP 地址;请替换为您的实际 IP 地址。
pipeline:
docker:
image: plugins/docker
custom_dns: [ 10.10.0.1, 10.10.0.2 ]
如果您使用的是企业版,则可以配置以下全局环境变量:
- name: PLUGIN_CUSTOM_DNS
value: 10.10.0.1,10.10.0.2
为什么这是必要的?
为什么某些配置会出现此问题而其他配置不会出现此问题?在这些情况下,为什么 DNS 配置不传播到 Docker 中的 Docker?为什么这适用于默认网桥而不是用户定义的网络?不幸的是,我目前无法提供根本原因,但可以提供一些可能解释该行为的信息......
似乎配置 DNS 的逻辑可能会有所不同,具体取决于您的 Docker 版本、主机配置等。
Docker 如何管理容器内的 DNS 配置的确切细节可以从一个 Docker 版本更改为下一个版本。因此,您不应假设 /etc/hosts、/etc/resolv.conf 等文件在容器内的管理方式,而不要管这些文件,而是使用以下 Docker 选项。
似乎默认的桥接网络在设计上确实与用户定义的桥接网络不同:
为了保持向后兼容性,默认桥接网络中的 DNS 配置被保留,没有行为改变。有关默认桥接网络中的 DNS 配置的更多信息,请参阅默认桥接网络中的 DNS。
我希望我能为这个问题提供一个详细的技术根本原因,并希望有人能填补这个答案的空白。同时,请使用上面记录的解决方法。