2016-12-20 2 views
2

Ich habe folgende vereinfachte Docker-Compose-Datei:Docker-compose nicht aktualisiert resolv.conf

 
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 

Damit Ich erwarte, dass die folgenden Einträge in den Behältern haben /etc/resolv.conf:

 
search pext.ch pnet.ch 
nameserver 192.168.198.2 

Aber stattdessen habe ich folgendes:

 
search pext.ch pnet.ch 
nameserver 127.0.0.11 
options ndots:0 

Wenn ich manuell den Behälter mit docker Lauf starten mit --dns 192.168.199.2 /etc/resolv.conf enthält einen Nameserver mit der angegebenen IP-Adresse.

Ist irgendetwas mit meiner docker-compose-Datei falsch oder ist es ein Fehler in docker-compose?

Ich verwende Docker Version 1.10.3 auf RHEL und Docker-komponieren 1.9.0

Antwort

2

Networking in Docker Dateiformat Compose v2 es different from version 1 ist, und ich denke, dass das eigentliche Problem ist. Es ist auch verwirrend, dass ein docker run ... Befehl funktioniert, während die docker-compose ... nicht funktioniert. Ich habe das gleiche Problem erlebt.

Was ich fand, ist, dass Docker Compose v2 erstellt ein benutzerdefiniertes Netzwerk für die definierten Container in der docker-compose.yml Datei, während docker run ... verwendet standardmäßig die Netzwerk überbrückten, genannt docker0 auf dem Host. Bei benutzerdefinierten Netzwerken verwendet docker auch einen embedded DNS server (das ist der 127.0.0.11). Die docs sagen:

Die IP-Adressen über die --dns Option übergeben werden durch den integrierten DNS-Server verwendet, um die DNS-Abfrage zu übermitteln, wenn eingebetteter DNS-Server ist nicht in der Lage eine Namensauflösungsanforderung aus den Behältern zu lösen. Diese --dns IP-Adressen werden vom integrierten DNS-Server verwaltet, und wird nicht in der /etc/resolv.conf Datei des Containers aktualisiert.

Ich denke, die letzte Zeile beantwortet Ihre Frage. Wie auch immer, dein Container sollte korrekt aufgelöst werden, oder?

+0

Ich habe das gleiche Problem. Obwohl /etc/resolv.conf nicht geändert wird erwartet, wie Sie darauf hinweisen, würde mein Container nicht richtig aufgelöst werden, wenn ich resolv.conf geändert, wie in anderer Antwort angegeben. – jotadepicas

1

Ich habe volumes: verwendet, um dieses Problem zu umgehen. In Ihrem Fall:

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 

Wo die ./resolv.conf Datei enthält, was genau Sie erwartet wie:

search pext.ch pnet.ch 
nameserver 192.168.198.2 

Hier die resolv.conf Datei übernimmt auf dem gleichen Ordner wie Docker-Compose-Datei.

+1

Ich endete das Gleiche. Ich konnte meinen Container nicht korrekt auflösen, indem ich dns in docker-compose.yml anwählte :( – jotadepicas