web-dev-qa-db-ja.com

Dockerビルド「 'archive.ubuntu.com'を解決できませんでした」apt-getがインストールに失敗する

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

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

RUN apt-get -y install supervisor nodejs npm

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

Could not resolve 'archive.ubuntu.com'

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

92
Matt Carrier

多くの頭痛の後、私は答えを見つけました。 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

85
Matt Carrier

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

会社のDNSサーバーをDOCKER_OPTS/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

参照

私は、ソリューションのすべての功績に値するロビンウィンスローの記事に基づいてソリューションを作成しました。ありがとう、ロビン!

「DockerのネットワークDNS設定を修正します。」ロビン・ウィンスロー。 2016年11月9日検索。 https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/

235
Matthew Kraus

私は同じ問題に遭遇しましたが、コメントを外す/ etc/default/dockerdnsエントリも/ etcの編集もビルドコンテナ内の/resolv.confまたは/ etc/docker/daemon.jsonが役立ちます。

しかし、オプション--network = Hostを指定してビルドした後、解決は再びうまくいきました。

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

たぶんこれは再び誰かを助けるでしょう。

32
Gerald Hansen

マットキャリアの答え がこの問題の正しい解決策だと思います。しかし、それを実装した後、私はまだ同じ動作を観察しました: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ファイルに追加することでした。

15
TMcManemy

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

しばらくしてから、ホストで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
Vini.g.fer

ローカルの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
Prakash N D

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

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

一般的に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機能を再び有効にすることを楽しみにしています。

5
Hay

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

基本的に実行:

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

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

4
Engineero

私は同じ問題を抱えており、記載されている手順を試しましたが、ネットワーク設定を更新するまで何も動作しないようです。

手順:

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

私と同じ問題(Ubuntu Xenial上)。

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

Dockerログ(journalctl -u docker.service)を分析した後、不適切なresolvconfの適用に関する警告が見つかった場合。

それに続いて、企業のネームサーバーがネットワークインターフェイスに追加されましたが、resolvconfには追加されていないことがわかりました。

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

Resolvconfの更新後(または再起動後)。

bash docker run --rm busybox nslookup google.com

すぐに働きました。

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

3
mkoertgen

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

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

そしてラップトップを再起動しました。

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

2
Yusuf Ibrahim

他のソリューションに時間をかけすぎる前に、単にDockerを再起動してくださいして、もう一度やり直してください。

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

2
CGFoX

私のシステム(macOS High Sierra 10.13.6 with Docker 2.1.0.1)では、これは企業のプロキシが原因でした。

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

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

     "proxies":
    {
      "default":
      {
        "httpProxy": "MYPROXY",
        "httpsProxy": "MYPROXY",
        "noProxy": "MYPROXYWHITELIST"
      }
    }
    
0
gustavz