はじめに
Proxy配下のUbuntu上で docker build の際にdns設定で困ってしまいました。Dockerfileに書かれたyumの最中に、外部のネットワークに到達できずに止まってしまいます。
proxy設定はbuildのオプションで渡せますが、dnsのオプションはありません。対処方法をメモに残します。
環境
- Ubuntu 16.04
- Docker 1.12.1
Dockerはパッケージでインストールしています。
そもそもの原因
- dockerのホストであるUbuntuでは、デフォルトでdnsmasq が有効になっていて、 /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 xxx.jp
- dockerはこの設定をコピーするとローカルにDNSがなくて困ってしまうので、デフォルトでパプリックなDNSを指定するようになっている(らしい)。
http://docs.docker.jp/engine/installation/linux/ubuntulinux.html#docker-dns
なので、docker buildしたイメージの中で、/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 xxx.jp
nameserver 8.8.8.8
nameserver 8.8.4.4
- docker build中にyumやらやっていると、proxyの名前解決をしようとして、8.8.8.8に問い合わせしようとするが、ネットワーク的に到達できずにこける。
ちなみにbuildしようとしているDockerfileはこちら。
https://github.com/Mashape/docker-java8/blob/master/Dockerfile
yumやらwgetやらやっています。
対応方法
はじめ、 /etc/default/docker を修正しましたが、設定が効きませんでした。dockerがsystemd起動なので、/etc/default のほうは見ないらしいです。
http://docs.docker.jp/engine/admin/systemd.html#custom-docker-daemon-options
を参考に以下のようにしています。
[Service]
Environment="DOCKER_NETWORK_OPTIONS=--dns dnsサーバのIP"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
本当はお作法的にはEnvironmentFileを設定してそちらにEnvironmentを書くべきだと思うのだけれど、どこにファイルを作るかを考えあぐねてこうなっています。
systemdのリロードとdockerの再起動。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
念のためshowで確認。
$ systemctl show --property=Environment docker
Environment=DOCKER_NETWORK_OPTIONS=--dns\x20dnsサーバのIP HTTP_PROXY=http://your-proxy:port/
HTTP_PROXYを/etc/systemd/system/docker.service.d/http-proxy.conf で設定しているので一緒に見えています。
この状態で docker build したらやっと最後までできました。
$ docker build -t centos_java8 --build-arg http_proxy=http://your-proxy:port/ --build-arg https_proxy=http://your-proxy:port/ .
もしや
buildで引き渡すhttp_proxyをIPで書けばこんなことしなくてもいいんじゃネ、って気がしなくもないけど試してない。