Dockerビルド「 'archive.ubuntu.com'を解決できませんでした」apt-getは何もインストールできません


101

以前は機能していたが、現在は機能していないさまざまなファイルに対してDockerビルドを実行しようとしています。

Dockerファイルにソフトウェアをインストールする行が含まれるとすぐに、パッケージが見つからなかったことを示すメッセージで失敗します。

RUN apt-get -y install supervisor nodejs npm

ログに表示される一般的なメッセージは

Could not resolve 'archive.ubuntu.com'

ソフトウェアがインストールされない理由は何ですか?


これは、マシンがネットから切断されたときに発生します... newgrp docker完全なログオフを実行する代わりに問題が発生した場合にのみ、新しいdocker installを使用してLinuxラップトップで発生し ますsudo usermod -aG docker myuserid...確かにそれは起こります
スコット・ステンランド

回答:


250

コメント解除DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"/etc/default/dockerマット・キャリアがなかった提案しないで私のために働きます。私の会社のDNSサーバーをそのファイルに入れることもしませんでした。しかし、別の方法があります(以下をお読みください)。

まず、問題を確認しましょう。

$ 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

コマンドがハングしているように見えても、最終的に「 'google.com'を解決できません」というエラーが表示される場合は、私と同じ問題があります。

nslookupコマンドは、IPアドレスに「google.com」のテキストアドレスを有効にするために、DNSサーバ8.8.8.8を照会します。皮肉なことに、8.8.8.8はGoogleのパブリックDNSサーバーです。場合はnslookup失敗し、8.8.8.8などのパブリックDNSサーバーは、あなたの会社によってブロックされる可能性があります(私はセキュリティ上の理由であると仮定します)。

会社のDNSサーバーをDOCKER_OPTSinに追加するとうまくいくと思います/etc/default/dockerが、なんらかの理由で私にはうまくいきませんでした。以下で、私にとって何が効果的かを説明します。

ソリューション

ホスト(Ubuntu 16.04を使用しています)で、プライマリおよびセカンダリDNSサーバーのアドレスを確認します。

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

これらのアドレスを使用して、ファイルを作成します/etc/docker/daemon.json

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

これを入れてください/etc/docker/daemon.json

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

ルートを終了:

# exit

Dockerを再起動します。

$ sudo service docker restart

検証

次に、/etc/docker/daemon.jsonファイルを追加して、「google.com」を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

参照

私は私のソリューションをRobin Winslowの記事に基づいています。ありがとう、ロビン!

「DockerのネットワークDNS構成を修正してください。」ロビン・ウィンスロー。2016年11月9日取得。https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/


3
変更後にサービスを開始できないというエラーを受け取りました。これは、/ etc / default / dockerおよび/etc/init.d/dockerのDOCKER_OPTSを変更したためです。変更を元に戻すと、
Docker

7
これは私にとっては(企業ネットワーク上で)機能しましたが、受け入れられたソリューションは機能しませんでした。
David Ebbo 2017年

1
これも私にとってはうまくいきましたが、受け入れられた解決策はうまくいきませんでした。nmcliではなく、nslookupを使用してDNSサーバーのIPを取得しました。
ネクロ2017年

2
daemon.jsonも私にとってはうまくいきます!そして、あなたはあなたの会社がこのコマンドで8.8.8.8をブロックしたかどうかを確認することができますnslookup google.com 8.8.8.8私の場合はそうですので私はこのエラーをconnection timed out; no servers could be reached
受け取り

3
/etc/default/docker一部の人にとってうまくいかなかった理由は(ファイルからのコメントを引用して)いると思います# THIS FILE DOES NOT APPLY TO SYSTEMD
Jakub Bochenski

88

多くの頭痛の後、私は答えを見つけました。Could not resolve 'archive.ubuntu.com'次の変更を行うことで修正できます。

  1. 次の行のコメントを外します /etc/default/docker
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"

  2. Dockerサービスを再起動します sudo service docker restart

  3. 無効なDNS設定をキャッシュした画像をすべて削除します。

  4. もう一度ビルドすると、問題は解決するはずです。

クレジットはAndrew SBに送られます


7
上記の#3を実行したくない場合は、
-no

8
これは私にとってはうまくいかず、私には理由がわかりません。私はこれを何週間もオンとオフで戦っています。
Corey Ogburn 2015

2
私はlinux mintで実行しているので、boot2dockerはありません。/ etc / default / dockerが作成され、上記のDOCKER_OPTSフラグが設定されています。サービスを再起動し、すべてのイメージとコンテナーをクリアしましたが、まだ何もしていません。
Corey Ogburn

2
@CoreyOgburn上記のjschorrで述べたように、--no-cache = trueも試してみます。例:docker build --no-cache=true ...
マットキャリア

6
私は走ったdocker build --no-cache=true -t docker-whale .が何も変わっていないようだ。
Corey Ogburn

46

同じ問題が発生しましたが、/ etc / default / docker dnsエントリのコメントを外さないようにするか、ビルドコンテナの/etc/resolv.confを編集しないと、/ etc / docker / daemon.jsonが役立ちます。

しかし、オプション--network = hostでビルドした後、解決は再びうまくいきました。

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

多分これは誰かを再び助けるでしょう。


「archive.ubuntu.com:80(xxxx)。-接続(111:接続が拒否されました)に接続できませんでした」という別のエラーが長く発生し、-network = hostの使用が修正されたことがわかりました私の問題
Eric Arseneau

たくさんのトラブルシューティングの後、これは私のために働いた唯一のものです。
math0ne

15

Matt Carrierの答えがこの問題の正しい解決策であると思います。しかし、それを実装した後も、同じ動作が観察されました。could not resolve 'archive.ubuntu.com'

その結果、私が接続していたネットワークがパブリックDNSをブロックしていることがわかりました。この問題の解決策は、私のホスト(Dockerを実行していたマシン)が使用していたのと同じネームサーバーを使用するようにDockerコンテナーを構成することでした。

私がトリアージした方法:

  1. 私はDockerのドキュメントを操作していたので、自分のマシンにすでにサンプルイメージをインストールしています。新しいコンテナーを開始してそのイメージを実行し、そのコンテナーに新しいbashセッションを作成することができました。docker run -it docker/whalesay bash
  2. コンテナはインターネットに接続されていますか?ping 172.217.4.238:(google.com)
  3. コンテナはホスト名を解決できますか? ping google.com

私の場合、最初のping結果は応答になり、2番目は応答しませんでした。

修正方法:

DNSがコンテナー内で機能していないことがわかったら、同じ動作をホストで再現できることを確認しました。nslookup google.comホスト上でうまく解決しました。しかし、nslookup google.com 8.8.8.8またはnsloookup google.com 8.8.4.4タイムアウトしました。

次に、nm-tool(Ubuntu 14.04で)を実行して、ホストが使用していたネームサーバーを見つけました。高速フィードバックの流れで、サンプルイメージを再度起動し、ネームサーバーのIPアドレスをコンテナのresolv.confファイルに追加しましたsudo vi /etc/resolv.conf。保存したら、もう一度pingを試行(ping google.com)し、今回は正常に機能しました。

コンテナのresolv.confに加えられた変更は永続的ではなく、コンテナを再起動すると失われることに注意してください。私の場合、より適切な解決策は、ネットワークのネームサーバーのIPアドレスをホストの/etc/default/dockerファイルに追加することでした。


2
アドレスネームサーバーを取得するための具体的なコマンド:nmcli device show <interfacename> | grep IP4.DNS(Ubuntu> = 15)およびnmcli dev list iface <interfacename> | grep IP4(Ubuntu <15)。クレジット:Marty Fried
r0estir0bbe

これはより広範な答えです。オフィスネットワークに切り替えるとき、またはネットワークの変更があるときは常に問題があります。会社のDNSサーバーを追加すると、ルックアップの問題が修正されます。
gvd 2016年

1
非常に指導的です!問題を確認し、修正を提供する(そして修正が機能することを確認する)方法を示す回答を見つけることはまれです。素晴らしいトラブルシューティング!
Matthew Kraus

ね,、手伝ってくれませんか?私は同じ問題を抱えていますが、私のホストはWindowsマシンで、そこでdockerコンテナーを実行し、Ubuntuイメージをそこで構成しようとしています。ここでネームサーバーといえば、私のWindowsマシンのDNSサーバーアドレスですか そして、その中で、それはプライマリーなのかセカンダリーなのか?
CodeHunter 2018年

私の組織がパブリックDNSをブロックし、DOCKER_OPTSの下の/ etc / default / dockerで組織のDNSを設定すると問題が解決し解決したため、これは私が直面した正確な問題です。全員がこの答えを歓迎します...
skm 2018年

7

ローカルのDNS IPをデフォルトのDockerファイルに追加した後、動作し始めました...以下の手順を見つけてください...

$ 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)

次に、Dockerをビルドします... :)


7

この問題も抱えている人のために、私は編集して私の問題を解決しました /etc/default/docker他の回答や質問で提案されているようにファイルを。しかし、どのIPをDNSとして使用するのか私にはわかりませんでした。

しばらくifconfig dockerして、DockerネットワークインターフェイスのIPを表示するためにホストで実行する必要があることがわかりました。

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)

それは172.17.0.1私の場合でした。これがこの問題を抱えている人を助けることを願っています。


7
docker

1
Ubuntuの18.04の場合:ifconfig docker0

6

私はいくつかのグーグルの後でこの答えを見つけました。私はWindowsを使用しているため、上記の回答の一部がファイルシステムに適用されませんでした。

基本的に実行します:

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

8.8.8.8私が使用している既存のネームサーバーを上書きするだけだと思います。それは私のために働いた!

いくつかのコメントに基づいて、あなたはrootになる必要があるかもしれません。そのためには、を発行しsudo -iます。


これはWindows 10ではssh機能しませんでした。存在しないためです。
Seanny123 2018

@ Seanny123私はこれで何かをしたので久しぶりですが、私もWindows 10を使っていました。当時、古いDocker Toolboxを使用していた可能性がありますか?それ以外の場合は、Windows SSHクライアント有効にする必要があります。私はおそらくそれから始めます。
Engineero

1
私はそれを行うには、ルートになった後に、これは、私のために問題を働いたsudo -iあなたがしている一度
MediaVince

5

私は、検索エンジンからこの問題に遭遇した人のために遅い応答を追加したかっただけです。

これを行わないでください:以前は/ etc / default / dockerにsetのオプションがありましたiptables=false。これはufwが機能しなかったため(3つのポートしか許可されていなくてもすべてが開かれていた)、私はこの質問への答えを盲目的に追跡しました:DockerこれにリンクされているDocker使用するUncomplicated Firewall(UFW)は何もブロックしていませんコメント

一般にiptablesのルール、NAT、ルーティングに関する理解が低いため、なぜ不合理なことをしたのでしょうか。

私はおそらくそれを誤って設定し、私のコンテナー内のDNS解決を強制終了したことがわかります。インタラクティブなコンテナターミナルを実行したとき:docker run -i -t ubuntu:14.04 /bin/bash

私はこれらの結果を得ました:

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

すべてのufw設定(before.rules)を元に戻し、ufwを無効にし、/ etc / default / dockerからiptables = falseを削除すると、コンテナーのDNS解決機能が復元されました。

代わりに、次の手順に従って ufw機能を再度有効にすることを楽しみにしています。


3

同じ問題があり、上記の手順を試しましたが、ネットワーク設定を更新するまで何も機能しないようです。

手順:

  1. 前述のように、に追加DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ip-masq=true"/etc/default/dockerます。
  2. を使用してPREROUTINGテーブルの内容を手動でフラッシュしますiptables -t nat -F POSTROUTING。これを実行した後、dockerを再起動すると、natテーブルが新しいIP範囲で初期化されます。

3

私にとっても同じ問題(Ubuntu Xenial上)。

  • docker run --dns ... コンテナが働いた。
  • docker build(docker-composeなど)のDockerデーモンオプションの更新が機能しませんでした。

journalctl -u docker.service不良なresolvconfに関する警告が適用された場合、Dockerログを分析した後()。

その後、私は企業のネームサーバーがネットワークインターフェースに追加されているが、resolvconfには追加されていないことを発見しました。

このソリューションを適用するインターフェイスで静的DNSを構成するにはどうすればよいですか?(askubuntu)、つまりネームサーバーの追加/etc/resolvconf/resolv.conf.d/tail

resolvconfを更新した後(または再起動した後)。

bash docker run --rm busybox nslookup google.com

即座に働いた。

私のdocker-composeビルドはすべて動作しています。


2

今日同じ問題が発生しました。/etc/default/dockerに以下の行を追加しました

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

その後、ラップトップを再起動しました。

私の場合、Dockerデーモンを再起動するだけでは不十分です。ラップトップを再起動して機能させる必要があります。


2

他のソリューションに時間を費やす前に、Docker再起動して再試行してください。

Windows 10でDocker Desktop for Windowsを使用して問題を解決しました。


管理者権限で再起動すると、私の問題は解決しました。
静脈

1

私もこれとしばらくの間苦労してきましたが、ここでそれが私のためにそれを解決したものですUbuntu 16.04 x64。私もそれが誰かの時間を節約することを望みます。

  1. /etc/NetworkManager/NetworkManager.conf:コメントアウト #dns=dnsmasq

  2. 作成(または変更)/etc/docker/daemon.json

{
    "dns": ["8.8.8.8"]
}
  1. 次のコマンドでdockerを再起動します。 sudo service docker restart


実際にはそうではありません。NetworkManager.confの修正は、私の場合に違いをもたらしました。
パラムンダール

システム全体でdnsmasqを無効にすることが、特にDocker向けの最良のソリューションであると私は強く疑います
OneCricketeer

この問題で2日間戦った後、うまくいったことを共有します。
パラムンダール

これは私にとっては
うまくいき

0

私のシステムでは(macOS High Sierra 10.13.6Docker 2.1.0.1)これは、企業のプロキシによるものでした。

私はこれを2つのステップで解決しました:

  1. でプロキシ設定を手動で構成する Preferences>Proxies
  2. 次のように、同じ設定をconfig.jsonに追加します~/.docker/config.json

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.