docker-compose不会更新resolv.conf

问题描述 投票:4回答:4

我有以下简化的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

docker docker-compose
4个回答
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文件中更新。

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


4
投票

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


0
投票

如前所述,resolv.conf并没有因为某些原因而改变,所以我发现了docker-compose的肮脏黑客:在resolv.conf期间改变docker build

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

像这样:

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

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


0
投票

我在这个存储库中运行了ubuntu版本的docker(docker.io 18.06.0)。我使用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。我认为改变可以解决我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.