先日、ハマったproxy関連の対応についての続報。
Ubuntu デスクトップ(19.04)でdnsの参照先が自身のIPアドレスしかない場合、コンテナ内の「/etc/resolv.conf」には勝手に「nameserver 8.8.8.8」「nameserver 8.8.4.4」が追加される。
そして、Proxy環境下ではこの設定が邪魔をして、elixirのmixコマンドが実行できなかった。
これに対応する場合の処理を見つけたので記述しておく。
docker run時に指定する場合
docker run時に指定する場合には、オプション「--dns=IPアドレス」を設定する。
# docker run --dns=192.168.xxx.yyy ~
docker build時に指定する場合
docker run時と異なり、docker build時にはdnsを明示的に指定するオプションがない。
そのため、そもそものコンテナ(イメージ?)の作成時に設定される「/etc/resolv.conf」の値をデフォルト値から変更する。
コンテナ内のデフォルトDNSを設定する
Docker コンテナのデフォルトDNSを設定する場合、ホストマシン上のDoockerサービスの設定ファイルである「/etc/docker/daemon.json」にdnsの設定を追記する。
ファイルが無い場合は、新規に作成する。(※ただし、root権限が必要)
dnsの設定は、json形式で「"dns": ["xxx.xxxx.xxxx.xxxx", "yyy.yyy.yyy.yyy",・・・]」で記述する。
今回は、自環境でコンテナ内の「/etc/resolv.conf」に自動で設定される「"192.168.26.2"」を指定した。この値については、自分の環境で有効な値に修正してくれればよい。
おまけとして、「"8.8.8.8"」「"8.8.4.4"」も追記しておいた。
順番的に、先頭のnameserverで探しにいってくれれば問題ないはず。
$ sudo vim /etc/docker/daemon.json $ cat /etc/docker/daemon.json { "dns": ["192.168.26.2", "8.8.8.8", "8.8.4.4"] }
/etc/docker/daemon.jsonの値は、ホストマシン上のDockerサービスの値である。
そのため、値を読み込ませるためにDockerサービスを再起動させる。
$ sudo systemctl restart network-manager.service
Dockerサービスの再起動が完了すると、コンテナ内の「/etc/resolv.conf」に設定が反映される。
実際に、Dockerイメージ作成中に「/etc/resolv.conf」の値を出力してみたら以下のように出力された。
Step 5/9 : RUN set -x && cat /etc/resolv.conf ---> Running in 1724551472ba search localdomain nameserver 192.168.26.2 nameserver 8.8.8.8 nameserver 8.8.4.4 + cat /etc/resolv.conf
その後、Docker イメージ作成中に「mix local.hex」を実行してみたが、問題なく実施できた。
Step 7/9 : RUN set -x && mix local.hex --force && mix local.rebar --force && mix archive.install hex phx_new ${PHX_VERSION} --force ---> Running in 049552c76df1 + mix local.hex --force * creating root/.mix/archives/hex-0.20.1 + mix local.rebar --force * creating root/.mix/rebar * creating root/.mix/rebar3 + mix archive.install hex phx_new 1.4.9 --force Resolving Hex dependencies... Dependency resolution completed: New: phx_new 1.4.9 * Getting phx_new (Hex package) All dependencies are up to date Compiling 10 files (.ex) Generated phx_new app Generated archive "phx_new-1.4.9.ez" with MIX_ENV=prod * creating /root/.mix/archives/phx_new-1.4.9
補足:参考情報
解決にあたり、以下の記事を参考にさせて頂いた。
最初はelixir(&mix)ベースで調査していたためなかなかたどり着けなかったが、ホストマシンがUbuntuでコンテナ側のresolv.confの値という観点で調べていくと、たくさん見つかった。