先日、ハマった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の値という観点で調べていくと、たくさん見つかった。