O Docker substitui meu arquivo /etc/resolv.conf dentro de contêineres

17

Quero definir meu resin/rpi-raspbian:jessiecontêiner /etc/resolv.confpara:

nameserver 208.67.222.222
nameserver 208.67.220.220

Meu Dockerfile possui a seguinte linha:

ADD resolv.conf /etc/resolv.conf

Este arquivo adicionado contém os servidores de nomes corretos.

Meu host do Docker /etc/resolv.confcontém as informações corretas.

Estou executando o contêiner assim:

docker run -itd --cap-add=NET_ADMIN --device /dev/net/tun \
-v /home/pi/share/ovpn:/ovpn \
--privileged --network=internet_disabled --name vpn-client \
--dns=208.67.222.222 \
openvpn-client_nat-gateway /bin/bash

Apesar de tudo isso, o contêiner fornece esta saída:

root@642b0f4716ba:/# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

Somente depois de alterar o resolv.conf manualmente de dentro do contêiner (ou com o executor do docker) é que ele parece certo.

Prefiro evitar corrigi-lo com um comando exec. Alguém tem uma idéia do que está acontecendo aqui?

Duncan Marshall
fonte
Existem alguns casos descritos em seu wiki que podem explicar sua situação.
Julie Pelletier
Dê uma olhada na minha pergunta e na resposta.
Zeinab Abbasimazar 15/08

Respostas:

14

AFAIK, a janela de encaixe substitui alguns arquivos em uma imagem quando ela é iniciada , mesmo se eles foram adicionados ao Dockerfile. Isso com certeza inclui /etc/hosts, e provavelmente o mesmo acontece /etc/resolv.conftambém. Aparentemente, isso é usado para criar adequadamente a rede "interna" padrão do Docker (para que as imagens se vejam, mas não o host etc.). Se você realmente tem certeza de que deseja substituir / modificar alguns desses arquivos, acredito que você deve faça isso como parte das ações de tempo de execução, como parte da CMDlinha. Por exemplo:

...
ADD resolv.conf /etc/resolv.conf.override
CMD cp /etc/resolv.conf.override /etc/resolv.conf && \
        your_old_commands...
akavel
fonte
3
Isto está certo. /etc/resolv.confé copiado do host quando um contêiner é iniciado.
wisbucky
4

Como posso ver, você está usando a user-defined networksversão do Docker Engine> = 1.10. Portanto, a partir da documentação oficial do docker engine sobre Embedded DNS server in user-defined networks:

Esses endereços IP --dns são gerenciados pelo servidor DNS incorporado e não serão atualizados no arquivo /etc/resolv.conf do contêiner.

Seu DNS precisa funcionar, mas você não verá nenhum arquivo de configuração.

Referências .

Thiago Almeida
fonte
0

Resolvi o problema se for o aplicativo Web de contêineres no Azure.

Existem 2 recipientes mate . Kudu e o anfitrião

Passos

1.Instale o ssh no seu arquivo docker (inclua também uma configuração sshd)

2. crie um Containerstart.sh (que atualiza o resolv.conf)

3. Defina o ponto de entrada lá dentro

Agora o host resolv.conf é atualizado e você pode usar qualquer DNS que desejar

PS: Se você não conseguir pegar o DNS personalizado na rede, não se preocupe. Nós também não. Pode ser necessário reiniciar se você estiver usando um ambiente ASE

Rıfat Erdem Sahin
fonte