【问题标题】:docker-compose does not update resolv.confdocker-compose 不更新 resolv.conf
【发布时间】:2017-05-05 17:58:19
【问题描述】:

我有以下简化的 docker-compose 文件:

版本:'2' 服务: 测试基地: 容器名称:test.base 图片:docker.pnet.ch/r-base:latest 重启:失败 网络: - 我的网 域名解析:192.168.198.2 dns_search: - pext.ch - pnet.ch 网络: 网: 司机:桥 driver_opts: com.docker.network.enable_ipv4:“真” ipam: 驱动程序:默认 配置: - 子网:192.168.198.0/24 网关:192.168.198.1

有了这个,我希望在容器 /etc/resolv.conf 中有以下条目:

搜索 pext.ch pnet.ch 名称服务器 192.168.198.2

但我有以下内容:

搜索 pext.ch pnet.ch 名称服务器 127.0.0.11 选项 ndots:0

当我使用 docker run 手动启动容器时,使用 --dns 192.168.199.2 /etc/resolv.conf 包含一个具有给定 IP 地址的名称服务器。

我的 docker-compose 文件有什么问题还是 docker-compose 中的错误?

我在 RHEL 和 docker-compose 1.9.0 上使用 docker 版本 1.10.3

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    我使用volumes: 来解决这个问题。在你的情况下:

    version: '2'
    services:
        test.base:
            container_name: test.base
            image: docker.pnet.ch/r-base:latest
            restart: on-failure
            networks:
                - mynet
            volumes:
                - ./resolv.conf:/etc/resolv.conf
    

    ./resolv.conf 文件包含您所期望的内容:

    search pext.ch pnet.ch
    nameserver 192.168.198.2
    

    这里假设resolv.conf 文件与您的 docker-compose 文件位于同一文件夹中。

    【讨论】:

    • 我最终也做了同样的事情。我无法通过在 docker-compose.yml 中指定 dns 来正确解析容器:(
    • 如果您通过容器名称引用 docker-network 中的其他容器并且您将卷设置为您的答案中的设置,您将丢失所需的条目(例如 127.0.0.11)适当地解析名称。我仍在努力让它干净地工作。
    【解决方案2】:

    Docker Compose 文件格式 v2 中的网络是 different from version 1,我认为这是真正的问题。 docker run ... 命令有效而 docker-compose ... 无效,这也令人困惑。我遇到了同样的问题。

    我发现Docker Compose v2为docker-compose.yml文件中定义的容器创建了一个用户定义的网络,而docker run ...默认使用桥接网络 strong>,在主机上命名为docker0。此外,对于自定义网络,docker 使用embedded DNS server(即127.0.0.11)。文档说:

    如果嵌入式 DNS 服务器无法解析来自容器的名称解析请求,嵌入式 DNS 服务器将使用通过 --dns 选项传递的 IP 地址来转发 DNS 查询。这些--dns IP 地址由嵌入式 DNS 服务器管理,不会在容器的 /etc/resolv.conf 文件中更新

    我认为最后一行回答了你的问题。无论如何,您的容器应该可以正确解析,不是吗?

    【讨论】:

    • 我也有同样的问题。尽管正如您所指出的那样,预计 /etc/resolv.conf 不会被修改,但除非我修改了 resolv.conf,否则我的容器将无法正确解析,正如其他答案中所指出的那样。
    【解决方案3】:

    如前所述,resolv.conf 出于某些特定原因不会更改,所以我发现docker-compose 的肮脏技巧:在docker build 期间更改resolv.conf

    您应该在命令的开头进行文件更改,并且在命令结束之前保持不变。

    像这样:

    RUN echo "nameserver 10.100.1.13" > /etc/resolv.conf && apt update

    我知道这远非良好的编码实践,但我认为它比从外部世界安装 /etc/resolf.conf 更优雅。

    【讨论】:

      【解决方案4】:

      我正在运行此存储库 (docker.io 18.06.0) 中保存的 ubuntu 版本的 docker。我使用 apt-get install docker.io 删除了该版本并安装了 docker.io。所以现在我有了这个版本:

      Client:
      Version:    17.12.1-ce
      API version:    1.35
      Go version: go1.10.1
      Git commit: 7390fc6
      Built:  Wed Apr 18 01:23:11 2018
      OS/Arch:    linux/amd64
      
      Server:
      Engine:
      Version:    17.12.1-ce
      API version:    1.35 (minimum version 1.12)
      Go version: go1.10.1
      Git commit: 7390fc6
      Built:  Wed Feb 28 17:46:05 2018
      OS/Arch:    linux/amd64
      Experimental:   false
      

      使用 docker-compose 运行的容器没有按预期配置 dns 的文件 resolv.conf,但每个容器都可以访问 Internet。我认为这个改变解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-16
        • 2020-10-11
        相关资源
        最近更新 更多