web-dev-qa-db-ja.com

Ubuntuのdockerコンテナー内にpipパッケージをインストールできません

fig guide に従ってpythonアプリケーションでdockerを使用していますが、dockerがコマンドに到達するとき

RUN pip install -r requirements.txt

次のエラーメッセージが表示されます。

Step 3 : RUN pip install -r requirements.txt
 ---> Running in fe0b84217ad1
Collecting blinker==1.3 (from -r requirements.txt (line 1))
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', gaierror(-2, 'Name or service not known'))': /simple/blinker/

これは数回繰り返され、別のメッセージが表示されます。

Could not find any downloads that satisfy the requirement blinker==1.3 (from -r requirements.txt (line 1))
  No distributions at all found for blinker==1.3 (from -r requirements.txt (line 1))

そのため、何らかの理由で、pipはdockerコンテナー内からパッケージにアクセスできません。インターネットアクセスを許可するために必要なことはありますか?

ただし、pipは、Dockerコンテナーの外部にインストールする場合は正常に機能し、その正確なパッケージ(blinker==1.3)でも問題なく機能するため、問題はありません。また、この問題はそのパッケージに固有のものではありません。パッケージのpip installコマンドでも同じ問題が発生します。

ここで何が起こっているのか誰にも分かりますか?

56
Miguel

問題は、Dockerが適切なDNSサーバーを使用していないという事実に起因しています。次の3つの方法で修正できます。

1.ローカル設定へのGoogle DNSの追加

/etc/resolv.confを変更し、次の行を最後に追加します

# Google IPv4 nameservers nameserver 8.8.8.8 nameserver 8.8.4.4

他のDNSサーバーを追加する場合は、 here を見てください。

ただし、この変更は永続的ではありません( this thread を参照)。永続化するには:$ Sudo nano /etc/dhcp/dhclient.conf prepend domain-name-server:prepend domain-name-servers 8.8.8.8, 8.8.4.4;の行のコメントを外して編集します

Dhclientを再起動します:$ Sudo dhclient

2. Docker構成の変更

ドキュメントで説明

デスクトップ上でUbuntuまたはUbuntu派生物を実行するシステムは、通常、/ etc/resolv.confファイルのデフォルトのネームサーバーとして127.0.0.1を使用します。

Dockerで使用するDNSサーバーを指定するには:

1. Log into Ubuntu as a user with Sudo privileges.

2. Open the /etc/default/docker file for editing :

    $ Sudo nano /etc/default/docker

3. Add the following setting for Docker.

    DOCKER_OPTS="--dns 8.8.8.8"

4. Save and close the file.

5. Restart the Docker daemon :

    $ Sudo systemctl restart docker

3. Dockerの実行時にパラメーターを使用する

Dockerを実行するとき、次のパラメーターを追加するだけです:--dns 8.8.8.8

51
Tanzaho

私は同じ問題を抱えており、しばらく悩みました。オンラインで多くの解決策を試しましたが、うまくいきませんでした。しかし、私は最終的に次のように解決しました:

ランニング:

Ubuntu 16.04 
docker Server 18.03.0-ce
  1. DNSサーバーのアドレスを見つけます。

    次のコマンドを実行して、DNSサーバーのアドレスを検出します。

    $: nmcli dev show | grep 'IP4.DNS'
    IP4.DNS[1]:                192.168.210.2
    
  2. Dockerデーモンを更新する

    /etc/docker/daemon.json.まだない場合)にdocker configファイルを作成し、次のコンテンツをファイルに追加します。

    {
        "dns": ["192.168.210.2", "8.8.8.8"]
    }
    

    配列の最初の項目はネットワークのDNSサーバーで、2番目はネットワークのDNSが利用できない場合のフォールバックとしてのgoogleのDNSサーバーです。

    ファイルを保存してから、Dockerサービスを再起動します

    $: Sudo service docker restart
    
16
user3214005

わかりました、私のdocker-machineを再起動すると問題は解決します。ありがとう– ismailsunni

これが私にとっての解決策でした:

docker-machine restart <machine-name>
16
orluke

私にとっては、単にdockerデーモンを再起動するのが助けになりました。

service docker restart
10
Bartoszer

Docker buildコマンドに--network = Hostを追加する必要がありました。

docker build --network=Host -t image_name .
7
Dan Hook

Ubuntuユーザー向け

Docker configに新しいDNSアドレスを追加する必要があります

Sudo nano /lib/systemd/system/docker.service

ExecStarの後にDNSを追加します。

--dns 10.252.252.252 --dns 10.253.253.253

次のようになります。

ExecStart=/usr/bin/dockerd -H fd:// --dns 10.252.252.252 --dns 10.253.253.253

それから:

systemctl daemon-reload
Sudo service docker restart

動作するはずです。

7
Broski

私の場合、docker version 1.13.0docker-machine 0.9.0の下のUbuntu 16.04を使用して、タンザホの回答(2. Docker構成の変更)を次のように少し変更する必要がありました。

  1. Sudo特権を持つユーザーとしてUbuntuにログインします。

  2. / etc/default/dockerファイルを編集用に開きます。

    Sudo vim /etc/default/docker
    
  3. Dockerに次の設定を追加します。

    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
    
  4. ファイルを保存して閉じます。

  5. Dockerデーモンを再起動します。

    Sudo service docker restart
    
5
vabada

私にとって、ドッカーのDNSが正しく構成されていないため、pipをインストールできませんでした。上記の手順を試しましたが、Docker DNSをGoogle DNSに構成してもラップトップで機能しません。 DockerのDNSは、ラップトップの割り当てられたIPにDNSを設定した場合にのみ適切に構成できます。

Ubuntuを使用している場合は、次の手順を使用して、DockerのDNSを構成できます。

  1. デバイスに割り当てられたIPを見つけます。これは次のいずれかで見つけることができます

    • ifconfigのイーサネットまたはwlanのinet addrを確認する
    • nmcli dev show | grep 'DNS'の任意のアドレスを選択
  2. /etc/docker/daemon.jsonのDNSを編集します(以前に存在しない場合は、このファイルを作成します)

    {
        "dns": ["your_ip_in_step_1"]
    }
    
  3. Dockerを再起動します:Sudo service docker restart

5
dekauliya

Docker初心者として、次のDockerのチュートリアルを行っていたときに、このように明らかになる問題がありました。

https://docs.docker.com/get-started/part2

会社のLANでDocker 17.03.1-ceを使用しています。

DNS設定を確認し、再確認しました。インターネットでの検索で見つかったDNSを構成するさまざまな方法を使用していました。一部は起動時にエラーを引き起こしました。 DNSを構成するために最終的に決めたアプローチは、上記のリンクのLinuxのトラブルシューティングセクションで、/ etc/dockerディレクトリのdaemon.jsonファイルを介してDNSを構成するアプローチでした。

しかし、私はまだこれと同じ問題を抱えていました。最終的に問題を解決したのは、http_proxyおよびhttps_proxy環境変数を介したプロキシの構成でした。 Dockerfileで指定しましたが、RUN pipコマンドの前に指定するのを怠りました。

DNSの問題のように見えますが、これらのENVコマンドをRUNコマンドの前に移動すると、違いが生じました。この問題を抱えている人に役立つ場合。

3
Deon McClung

誰かがdocker-composeを使用してこれを読んでいる場合。私はyamlファイルを次のように変更することでこれを解決することができました

version: 3.4
service: my-app
  build:
  context: .
  network: Host

書くことと同等です

docker build . --network Host
2
Luke Preston

理由はわかりませんが、エラーは、pipが/simple/blinker/部分ではなくpypi.python.orgをDNSホスト名として解決しようとしていることを意味します。 urlparseは、そのような文字列をホスト名部分として返すことができます。 ~/.pip/pip.confに問題があるかどうかを確認します

2
Antti Haapala

実行させてください。時々pypiが接続の問題を抱えており、それが壊れていると思わせるために騒々しくあなたの顔に置かれます。確かに、それを転がしてみましょう、あなたはそれがそれ自身のためにうまくいくと思うかもしれません。

これらの赤いエラー行にもかかわらず、一番下の行は「正常に構築されました」

$ docker build .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM docker-registry.aws.example.com:5000/cmcrc/python2:20160517120608
 ---> 1e5034711aa9
Step 2 : RUN pip install prometheus-client requests
 ---> Running in f3c580fc93ae
Collecting prometheus-client
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8610>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d87d0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8990>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8b50>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe15a1d8d10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/prometheus-client/
  Downloading prometheus_client-0.0.13.tar.gz
Collecting requests
  Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9d4d0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9da10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9dc50>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9de10>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None)) after connection broken by 'NewConnectionError('<pip._vendor.requests.packages.urllib3.connection.HTTPConnection object at 0x7fe159e9dfd0>: Failed to establish a new connection: [Errno -2] Name or service not known',)': /pypi/requests/
  Downloading requests-2.10.0-py2.py3-none-any.whl (506kB)
Building wheels for collected packages: prometheus-client
  Running setup.py bdist_wheel for prometheus-client: started
  Running setup.py bdist_wheel for prometheus-client: finished with status 'done'
  Stored in directory: /root/.cache/pip/wheels/04/94/f5/b803b2ff65e8344e99ca99b7f7cb8194224017167809a32b78
Successfully built prometheus-client
Installing collected packages: prometheus-client, requests
Successfully installed prometheus-client-0.0.13 requests-2.10.0
 ---> 19c5e3cfe08f
Removing intermediate container f3c580fc93ae
Successfully built 19c5e3cfe08f
1
John Mee

同じ問題が発生しました。エラーの原因はプロキシです。

だから、私は次のDockerfileを編集します

RUN pip install -r /app/requirements.txt --proxy=http://user:pass@addr:port
1
H.H

Dockerを初めて使用し、ここで説明したすべての方法を試しましたが、まだ正しくありませんでした。 Dockerのバージョンは18で、ubuntuのバージョンは16でした。私はこの方法を試しました。-最初に、会社のインターネットネットワークでdockerを構築しました。このネットワークは、いくつかのサイトや、ここでうまくいかなかったサイトをブロックしています。第二に、私は自分のネットワーク(たとえば携帯電話で使用しているネットワーク)に接続してみました。物事はうまくいきました。 Requirements.txtが正常にインストールされ、dockerがビルドされました。

1
Piyal George

Google DNS(8.8.8.8)または10.0.0.2へのdocker DNSの構成は、私の会社の環境では機能しませんでした。

実行中:$ drill @ 8.8.8.8 www.Amazon.comまたは@ 10.0.0.2がこれを確認しました。

動作するDNSを見つけるために、$ drill www.Amazon.comを実行し、ネットワークで使用されているDNS IPを取得しました。

次に、次の手順を使用してUbuntuに設定し、DockerのDNSを構成します。

/etc/docker/daemon.jsonのDNSを変更しました

{
    "dns": ["the DNS ip from step1"]
}

Restart docker: Sudo service docker restart
1
Tomas

私にとっては、大学のVPNに接続されていることが原因でした。切断すると、問題は「解決」しました。

1
p0wl