問題:Centos、ubuntu、またはdebianに依存するDockerfileを使用したビルドは、ビルドに失敗します。
環境:Mac OS Xを使用し、ゲストUbuntu 14.04でVMWareを実行し、Dockerを実行しています:
mdesales@ubuntu ~ $ Sudo docker version
Client version: 1.1.2
Client API version: 1.13
Go version (client): go1.2.1
Git commit (client): d84a070
Server version: 1.1.2
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): d84a070
動作:「docker build」を使用すると、パッケージのダウンロードに失敗します。そのようなDockerfileの例を次に示します。 https://github.com/Krijger/docker-cookbooks/blob/master/jdk8-Oracle/Dockerfile 、 https://github.com/ ottenhoff/centos-Java/blob/master/Dockerfile
--dnsでコンテナを実行できることは知っていますが、これはビルド中です。
CENTOS
Centos RUN yum install a b cから
UBUNTU
Ubuntuからapt-get install a b cを実行
ユーザーは、それがDNS構成の問題である可能性があると報告しました。
Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all
---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Couldn't resolve Host 'mirrorlist.centos.org
それでも問題は解決しませんでした。したがって、#docker @ Freenodeのほとんどのユーザーは、DNS構成に問題がある可能性があると述べました。
$ Sudo cat /etc/resolv.conf
nameserver 127.0.1.1
search localdomain
同じ問題を変えてみた...
[〜#〜]問題[〜#〜]
#docker @ freenodeで何人かの開発者と話をすると、問題は誰にとっても明らかでした:DNSと環境。ビルドは、自宅の通常のインターネット接続で問題なく動作します。
解決策:
この問題は、プライベートDNSサーバーがある環境で発生するか、ネットワークがGoogleのDNSサーバーをブロックします。 Dockerコンテナが8.8.8.8をpingできる場合でも、ビルドはファイアウォールまたはデータセンターの背後にある同じプライベートDNSサーバーにアクセスする必要があります。
ホストOSが設定されているように、プライベートDNSサーバーを指すように--dnsスイッチを使用してDockerデーモンを起動します。それは試行錯誤によって発見されました。
詳細
私のMAC OS XであるホストOSには、/ etc/resolv.confで異なるDNSが構成されています。
mdesales@Marcello-Work ~ (mac) $ cat /etc/resolv.conf
search corp.my-private-company.net
nameserver 172.18.20.13
nameserver 172.20.100.29
構築中にホストがGoogleのIPアドレス8.8.8.8にパケットをドロップしている可能性があります...これら2つのIPアドレスを取得し、Ubuntuのdockerデーモン構成の下に配置しました。
mdesales@ubuntu ~ $ cat /etc/default/docker
...
...
# Use DOCKER_OPTS to modify the daemon startup options.
DOCKER_OPTS="--dns 172.18.20.13 --dns 172.20.100.29 --dns 8.8.8.8"
...
ビルドは期待どおりに動作するようになりました!
$ Sudo ./build.sh
Sending build context to Docker daemon 7.168 kB
Sending build context to Docker daemon
Step 0 : FROM centos
---> b157b77b1a65
Step 1 : MAINTAINER [email protected]
---> Running in 49bc6e233e4c
---> 2a380810ffda
Removing intermediate container 49bc6e233e4c
Step 2 : RUN yum install -y curl; yum upgrade -y; yum update -y; yum clean all
---> Running in 5f11b65c87b8
Loaded plugins: fastestmirror
Determining fastest mirrors
* base: mirror.supremebytes.com
* extras: centos.mirror.ndchost.com
* updates: mirrors.tummy.com
Resolving Dependencies
--> Running transaction check
---> Package systemd.x86_64 0:208-11.el7 will be updated
---> Package systemd.x86_64 0:208-11.el7_0.2 will be an update
---> Package systemd-libs.x86_64 0:208-11.el7 will be updated
---> Package systemd-libs.x86_64 0:208-11.el7_0.2 will be an update
--> Finished Dependency Resolution
IRCチャンネルで助けてくれた@BrianFと他の人たちに感謝します!
永続VMソリューション-2015年7月2日更新
GitHub EnterpriseとCoreOS Enterprise Docker Registryが混在しています...だから、VMを取得するために、ホストマシンから企業DNSサーバーを追加することが重要でした作業。
ゲストOSの/etc/resolv.confをホストの/etc/resolv.confに置き換えることでも問題は解決しました! Docker 1.7.0。 VMWare FusionでUbuntu 15.04を使用して新しいVMを作成したところ、この問題が再び発生しました...
/ etc/resolv.conf BEFORE
~/dev/github/public/stackedit on ⭠ master ⌚ 20:31:02
$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search localdomain
/ etc/resolv.conf AFTER *
~/dev/github/public/stackedit on ⭠ master ⌚ 20:56:09
$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search corp.mycompany.net
nameserver 10.180.194.35
nameserver 10.180.194.36
nameserver 192.168.1.1
同じ問題がありました。私の場合、提供されたソリューションは役に立ちませんでした。しかし、Dockerfileを更新してプロキシの環境変数を追加するとすぐに機能しました。
ENV HTTP_PROXY http://<proxy_Host>:<port>
ENV HTTPS_PROXY http://<proxy_Host>:<port>
ENV http_proxy http://<proxy_Host>:<port>
ENV https_proxy http://<proxy_Host>:<port>
127.0.1.1でリッスンしているローカルキャッシュネームサーバーがコンテナ内からアクセスできないことが原因である可能性があります。
以下をDockerfile
に入れてみてください:
CMD "sh" "-c" "echo nameserver 8.8.8.8 > /etc/resolv.conf"
また、ホスト(私の場合はmac osx)からネームサーバーをdocker-machine vmに追加するだけで問題が解決します。
私にとって問題は、ISPがGoogleのDNS(8.8.8.8)をブロックしたことでした。これは、Dockerがフォールバックのデフォルトとして使用するものです。
ここでのコツは、DNS IPを見つけて、それを使用するようにdockerに指示することです。
私の場合(Ubuntu 17.04を実行中)、/etc/resolv.conf
は機能しませんでしたが、このコマンドを使用しました。
nmcli dev show | grep IP4.DNS
次に、このIPを取得し、/etc/defaults/docker
:
DOCKER_OPTS="--dns 192.168.50.1"
Dockerデーモンを再起動して、ビルドを再試行してください。
私の場合、問題は、当社のDNSにいくつかの点で欠陥があることです。これには、/etc/hosts
、およびdockerの場合は/etc/docker/daemon.json
。それはエラーを隠していたファイルです:
{
"dns": ["10.5...", "10.5...", "10.5..."]
}
これをバックアップして置き換えました
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
そして、それは働き始めました。すべての場合に機能するソリューションを探しています-カスタムDNSサーバーと通常のネットワークのホームを必要とするVPNで。
最新のLinuxでは、/etc/hosts
が生成され、DNSはSystemDによって管理されます。 Dockerがこれをどのように処理するかはわかりませんが、おそらく127.0.0.53
。
ローカルリポジトリミラーを作成します-これは docker-mirror-packages-repo としても実行できます
次に、"docker build --add-Host "archive.ubuntu.com:repo-docker-ip"
を実行して、ビルドプロセスをローカルミラーからダウンロードします。これは高速であるだけでなく、ビルドの再現性が向上します。
docker-systemctl-replacement のテストスイートにそれを使用しています。これは、それぞれが数十のdocker再構築を伴う多くのディストリビューションとの互換性をテストしています。