Compilação do Docker “Não foi possível resolver 'archive.ubuntu.com'” apt-get falha ao instalar nada

101

Tenho tentado executar o Docker build em vários arquivos que funcionavam anteriormente, que agora não estão mais funcionando.

Assim que o arquivo Docker incluísse qualquer linha para instalar o software, ele iria falhar com uma mensagem dizendo que o pacote não foi encontrado.

RUN apt-get -y install supervisor nodejs npm

A mensagem comum que apareceu nos logs foi

Could not resolve 'archive.ubuntu.com'

Alguma ideia de por que algum software não instala?

Matt Carrier
fonte
isso vai acontecer quando a máquina for desconectada da rede ... Eu vi isso acontecer no laptop linux com uma nova instalação do docker se eu apenas emitir em newgrp dockervez de fazer um logoff completo e fazer o login depois de me entregar sudo usermod -aG docker myuserid... é um caso extremo para com certeza, no entanto, acontece
Scott Stensland

Respostas:

250

Descomentando DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"em /etc/default/dockercomo Matt portador sugeriu que não funciona para mim. Nem colocar os servidores DNS da minha empresa nesse arquivo. Mas, há outra maneira (continue lendo).

Primeiro, vamos verificar o problema:

$ docker run --rm busybox nslookup google.com   # takes a long time
nslookup: can't resolve 'google.com'   # <--- appears after a long time
Server:    8.8.8.8
Address 1: 8.8.8.8

Se o comando parecer travar, mas eventualmente exibir o erro "não é possível resolver 'google.com'", você tem o mesmo problema que eu.

O nslookupcomando consulta o servidor DNS 8.8.8.8 para transformar o endereço de texto de 'google.com' em um endereço IP. Ironicamente, 8.8.8.8 é o servidor DNS público do Google . Se nslookupfalhar, os servidores DNS públicos como 8.8.8.8 podem ser bloqueados pela sua empresa (o que presumo que seja por razões de segurança).

Você pensaria que adicionar os servidores DNS da sua empresa ao DOCKER_OPTSin /etc/default/dockerdeveria resolver, mas por algum motivo, não funcionou para mim. Eu descrevo o que funcionou para mim abaixo.

SOLUÇÃO :

No host (estou usando o Ubuntu 16.04), descubra os endereços de servidor DNS primário e secundário:

$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]:              10.0.0.2
IP4.DNS[2]:              10.0.0.3

Usando esses endereços, crie um arquivo /etc/docker/daemon.json:

$ sudo su root
# cd /etc/docker
# touch daemon.json

Coloque isso em /etc/docker/daemon.json:

{                                                                          
    "dns": ["10.0.0.2", "10.0.0.3"]                                                                           
}     

Sair da raiz:

# exit

Agora reinicie o docker:

$ sudo service docker restart

VERIFICAÇÃO :

Agora, verifique se adicionar o /etc/docker/daemon.jsonarquivo permite que você resolva 'google.com' em um endereço IP:

$ docker run --rm busybox nslookup google.com
Server:    10.0.0.2
Address 1: 10.0.0.2
Name:      google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net

REFERÊNCIAS :

Baseei minha solução em um artigo de Robin Winslow, que merece todo o crédito pela solução. Obrigado, Robin!

"Corrigir configuração DNS de rede do Docker." Robin Winslow. Retirado 2016-11-09. https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

Matthew Kraus
fonte
3
Recebi um erro, informando que o serviço não pode ser iniciado após as alterações. Isso aconteceu porque eu modifiquei DOCKER_OPTS em / etc / default / docker e /etc/init.d/docker. Reverter as alterações resolveu o problema de inicialização do serviço docker
Twiebie
7
Isso funcionou para mim (em uma rede corporativa), enquanto a solução aceita não.
David Ebbo
1
Isso funcionou para mim também, enquanto a solução aceita não. Usei o nslookup para obter o IP do meu servidor DNS, embora não o nmcli.
Necro
2
daemon.json funciona para mim também! E você pode verificar se sua empresa bloqueou 8.8.8.8 por este comando nslookup google.com 8.8.8.8No meu caso é assim que eu recebi este erroconnection timed out; no servers could be reached
ROTOGG
3
Acho que o motivo /etc/default/dockernão funcionou para algumas pessoas é (citando um comentário do arquivo)# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski
88

Depois de muita dor de cabeça, encontrei a resposta. Could not resolve 'archive.ubuntu.com'pode ser corrigido fazendo as seguintes alterações:

  1. Remova o comentário da seguinte linha em /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Reinicie o serviço Docker sudo service docker restart

  3. Exclua todas as imagens que armazenaram em cache as configurações de DNS inválidas.

  4. Construa novamente e o problema deve ser resolvido.

O crédito vai para Andrew SB

Matt Carrier
fonte
7
você também pode adicionar --no-cache = true se preferir não fazer o # 3 acima
jschorr
8
Isso não está funcionando para mim e não tenho ideia do porquê. Venho lutando contra isso há semanas.
Corey Ogburn
2
Estou executando no linux mint, então não há boot2docker. / etc / default / docker é criado e tem o sinalizador DOCKER_OPTS acima. Reiniciei o serviço, limpei todas as imagens e contêineres, mas ainda nada.
Corey Ogburn
2
@CoreyOgburn Eu também tentaria o --no-cache = true conforme mencionado acima por jschorr. ex:docker build --no-cache=true ...
Matt Carrier
6
Corri, docker build --no-cache=true -t docker-whale .mas nada diferente parece ter acontecido.
Corey Ogburn
46

Tive o mesmo problema, mas nem a descomentar as entradas de dns de / etc / default / docker nem editar o /etc/resolv.conf no contêiner de compilação ou o /etc/docker/daemon.json me ajuda.

Mas depois de criar com a opção --network = host, a resolução funcionou novamente.

docker build --network=host -t my-own-ubuntu-like-image .

Talvez isso ajude alguém novamente.

Gerald Hansen
fonte
Há muito tempo que recebo um erro diferente "Não foi possível conectar ao archive.ubuntu.com:80 (xxxx). - connect (111: Conexão recusada)" e descobri que o uso de --network = host foi corrigido meu problema
Eric Arseneau
Após toneladas de solução de problemas, essa foi a única coisa que funcionou para mim.
math0ne
15

Acredito que a resposta de Matt Carrier seja a solução correta para este problema. No entanto, depois de implementá-lo, eu ainda observado o mesmo comportamento: could not resolve 'archive.ubuntu.com'.

Isso me levou a descobrir que a rede à qual eu estava conectado estava bloqueando o DNS público. A solução para esse problema era configurar meu contêiner Docker para usar o mesmo servidor de nomes que meu host (a máquina na qual eu estava executando o Docker) estava usando.

Como eu fiz a triagem:

  1. Como estava trabalhando na documentação do Docker, já tinha uma imagem de exemplo instalada em minha máquina. Consegui iniciar um novo contêiner para executar essa imagem e criar uma nova sessão bash nesse contêiner:docker run -it docker/whalesay bash
  2. O contêiner tem conexão com a Internet ?: ping 172.217.4.238(google.com)
  3. O contêiner pode resolver nomes de host? ping google.com

No meu caso, o primeiro pingresultou em respostas, o segundo não.

Como eu consertei:

Assim que descobri que o DNS não estava funcionando dentro do contêiner, verifiquei que poderia duplicar o mesmo comportamento no host. nslookup google.comresolvido muito bem no host. Mas, nslookup google.com 8.8.8.8ou nsloookup google.com 8.8.4.4expirou.

Em seguida, encontrei o (s) servidor (es) de nomes que meu host estava usando ao executar nm-tool(no Ubuntu 14.04). Na veia de um feedback rápido, comecei a imagem exemplo de novo, e adicionou o endereço IP do servidor de nome para o arquivo resolv.conf do container: sudo vi /etc/resolv.conf. Depois de salvo, tentei fazer o ping novamente ( ping google.com) e desta vez funcionou!

Observe que as alterações feitas no resolv.conf do contêiner não são persistentes e serão perdidas nas reinicializações do contêiner. No meu caso, a solução mais adequada foi adicionar o endereço IP do servidor de nomes da minha rede ao /etc/default/dockerarquivo do host .

TMcManemy
fonte
2
Comandos concretos para obter os endereços dos servidores de nomes: nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15) e nmcli dev list iface <interfacename> | grep IP4(Ubuntu <15). Crédito: Marty Fried .
r0estir0bbe
Esta é uma resposta mais extensa. Sempre tenho problemas quando mudo para a rede do meu escritório ou quando há mudanças de rede. Adicionar o servidor DNS da sua empresa corrige o problema de pesquisa.
gvd
1
Muito instrutivo! É raro encontrar respostas que mostram como verificar o problema e, em seguida, fornecer uma correção (e verificar se a correção funciona). Ótima solução de problemas!
Matthew Kraus
Ei, você pode me ajudar? Estou tendo o mesmo problema, mas meu host é uma máquina Windows onde estou tentando executar meu contêiner do docker e tentando configurar a imagem do Ubuntu lá. Quando você fala de servidor de nomes aqui, isso significa o endereço do servidor DNS da minha máquina Windows? E nisso também, será o primário ou o secundário?
CodeHunter
Este é exatamente o problema que enfrentei quando minha organização bloqueou o DNS público e a configuração do DNS da organização em / etc / default / docker em DOCKER_OPTS funcionou e o problema foi resolvido. Todos saudam esta resposta ...
skm
7

Depois de adicionar ip dns local ao arquivo docker padrão, ele começou a funcionar para mim ... encontre as etapas abaixo ...

$ nm-tool # (will give you the dns IP)

DNS: 172.168.7.2

$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"

$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)

$ docker rmi $(docker images -q) # (remove all the images)

$ service docker restart #(restart the docker to pick up dns setting)

Agora vá em frente e construa o docker ... :)

Prakash ND
fonte
7

Para quem também está tendo esse problema, resolvi meu problema editando o /etc/default/dockerarquivo, conforme sugerido por outras respostas e perguntas. Porém não tinha ideia de qual IP usar como DNS.

Só depois de um tempo descobri que precisava executar ifconfig dockerno host para mostrar o IP da interface de rede do docker.

docker0   Link encap:Ethernet  Endereço de HW 02:42:69:ba:b4:07  
          inet end.: 172.17.0.1  Bcast:0.0.0.0  Masc:255.255.0.0
          endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
          pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)

Foi 172.17.0.1no meu caso. Espero que isso ajude todos que também estão tendo esse problema.

Vini.g.fer
fonte
7
Seria útil se você especificasse a maneira como editou seu arquivo docker
physincubus
1
No Ubuntu 18.04:ifconfig docker0
automorphic
6

Eu encontrei essa resposta depois de pesquisar no Google. Estou usando o Windows, portanto, algumas das respostas acima não se aplicam ao meu sistema de arquivos.

Basicamente, execute:

docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Que apenas sobrescreve o servidor de nomes existente usado com 8.8.8.8eu acredito. Funcionou para mim!

Com base em alguns comentários, você pode ter que ser root. Para fazer isso, problema sudo -i.

Engenheiro
fonte
Isso não funcionou para mim no Windows 10, porque sshnão existe?
Seanny123
@ Seanny123 já faz um tempo que não faço nada com isso, mas também estava no Windows 10. Posso estar usando a antiga caixa de ferramentas do Docker na época? Caso contrário, pode ser necessário habilitar o cliente SSH do Windows . Eu provavelmente começaria com isso.
Engineero
1
isso funcionou para mim depois que me tornei root, para fazer isso, problema sudo -iuma vez que você está
MediaVince
5

Eu só queria adicionar uma resposta tardia para qualquer pessoa que encontrar esse problema nos mecanismos de pesquisa.

NÃO faça isso: eu costumava ter uma opção em / etc / default / docker para definir iptables=false. Isso aconteceu porque o ufw não funcionou (tudo foi aberto, embora apenas 3 portas fossem permitidas), então eu segui cegamente a resposta a esta pergunta: O Firewall Descomplicado (UFW) não está bloqueando nada ao usar o Docker e este, que estava vinculado no comentários

Tenho um conhecimento muito baixo das regras de iptables / nat / roteamento em geral, por isso devo ter feito algo irracional.

Provavelmente o configurei incorretamente e eliminei a resolução DNS dentro de meus contêineres. Quando executei um terminal de contêiner interativo:docker run -i -t ubuntu:14.04 /bin/bash

Tive estes resultados:

root@6b0d832700db:/# ping google.com
ping: unknown host google.com

root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4

root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms

Reverter todas as minhas configurações de ufw (before.rules), desabilitar ufw e remover iptables = false de / etc / default / docker restaurou a funcionalidade de resolução DNS dos contêineres.

Agora estou ansioso para reativar a funcionalidade do ufw, seguindo estas instruções .

Feno
fonte
3

Eu tenho o mesmo problema e tentei as etapas mencionadas, mas parece que nada funciona até atualizar as configurações de rede.

Os passos:

  1. Conforme mencionado, adicione DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"a /etc/default/docker.
  2. Limpe manualmente o conteúdo da tabela PREROUTING usando o iptables -t nat -F POSTROUTING. Depois de executar isso, reinicie o docker e ele inicializará a tabela nat com o novo intervalo de IP.
JQian
fonte
3

O mesmo problema para mim (no Ubuntu Xenial).

  • docker run --dns ... para recipientes trabalhados.
  • A atualização das opções do daemon do docker para docker build(docker-compose etc.) não funcionou.

Depois de analisar os logs do docker ( journalctl -u docker.service), foi encontrado algum aviso sobre resolvconf ruim aplicado.

Depois disso, descobri que nossos servidores de nomes corporativos foram adicionados às interfaces de rede, mas não no resolvconf.

Apliquei esta solução Como configuro meu DNS estático nas interfaces? (askubuntu) , ou seja, adicionar servidores de nomes a/etc/resolvconf/resolv.conf.d/tail

Depois de atualizar o resolvconf (ou reiniciar).

bash docker run --rm busybox nslookup google.com

funcionou instantaneamente.

Todas as minhas compilações docker-compose estão funcionando agora.

mkoertgen
fonte
2

Tive o mesmo problema hoje, acabei de adicionar a linha abaixo em / etc / default / docker

DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"

e reiniciei meu laptop.

No meu caso, reiniciar o docker daemon não é suficiente para mim, eu tenho que reiniciar meu laptop para fazê-lo funcionar.

Yusuf Ibrahim
fonte
2

Antes de gastar muito tempo com qualquer uma das outras soluções, simplesmente reinicie o Docker e tente novamente.

Resolvi o problema para mim, usando o Docker Desktop para Windows no Windows 10.

CGFoX
fonte
Reiniciá-lo com direitos de administrador resolveu o problema no meu caso.
vein
1

Eu tenho lutado por algum tempo com isso agora também, mas aqui está o que resolveu para mim Ubuntu 16.04 x64. Espero que economize o tempo de alguém também.

  1. In /etc/NetworkManager/NetworkManager.conf: comentar #dns=dnsmasq

  2. Criar (ou modificar) /etc/docker/daemon.json:

{
    "dns": ["8.8.8.8"]
}
  1. Reinicie o docker com: sudo service docker restart
Palamunder
fonte
Parece ser a mesma solução que stackoverflow.com/a/40516974/2308683
OneCricketeer
Na verdade não. A correção no NetworkManager.conf fez a diferença para o meu caso.
palamunder
Duvido muito que desativar o dnsmasq em todo o sistema seja a melhor solução especificamente para o Docker
OneCricketeer
Estou compartilhando o que funcionou para mim depois de lutar 2 dias com esse problema.
palamunder
Isso não funcionou para mim
desmond13
0

No meu sistema ( macOS High Sierra 10.13.6com Docker 2.1.0.1) isso era devido a um proxy corporativo.

Resolvi isso em duas etapas:

  1. Defina manualmente as configurações de proxy em Preferences>Proxies
  2. Adicione as mesmas configurações ao seu config.json, ~/.docker/config.jsoncomo:

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
Gustavz
fonte