docker-compose不会更新resolv.conf

时间:2016-12-20 13:36:29

标签: docker docker-compose

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

version: '2'
services:
    test.base:
        container_name: test.base
        image: docker.pnet.ch/r-base:latest
        restart: on-failure
        networks:
            - mynet
        dns: 192.168.198.2
        dns_search:
            - pext.ch
            - pnet.ch
networks:
    mynet:
        driver: bridge
        driver_opts:
            com.docker.network.enable_ipv4: "true"
        ipam:
            driver: default
            config:
                - subnet: 192.168.198.0/24
                  gateway: 192.168.198.1

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

search pext.ch pnet.ch
nameserver 192.168.198.2

但我有以下内容:

search pext.ch pnet.ch
nameserver 127.0.0.11
options 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

4 个答案:

答案 0 :(得分:4)

Docker中的网络编写文件格式v2它是different from version 1,我认为这是实际问题。令人困惑的是docker run ...命令有效,而docker-compose ...则没有。我遇到了同样的问题。

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

  

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

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

答案 1 :(得分:3)

我使用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文件位于同一文件夹中。

答案 2 :(得分:0)

如前所述,resolv.conf出于某些特定原因并没有发生变化,因此我发现docker-compose受到了骇人的攻击:在resolv.conf期间就地更改了docker build

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

赞:

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

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

答案 3 :(得分:0)

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

<?php if(($this->session->flashdata('name')=='Hello, I am Flash Data')){?>
     <div class="alert alert-info alert-dismissible fade in" role="alert" id="flash_data"> //set your id here
     <i class="glyphicon glyphicon-ok"></i>  <?php echo $this->session->flashdata('notif'); ?>
     </div>
<?php } ?>

以docker-compose运行的容器没有按预期配置的dns文件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 ,但是每个容器都可以访问Internet。我认为变化解决了我的问题。