Dockerはコンテナ内の/etc/resolv.confファイルを上書きします。

Dockerはコンテナ内の/etc/resolv.confファイルを上書きします。

resin/rpi-raspbian:jessie私のコンテナを次のように設定したいと思います/etc/resolv.conf

nameserver 208.67.222.222
nameserver 208.67.220.220

私のDockerfileには次の行があります。

ADD resolv.conf /etc/resolv.conf

この追加されたファイルには正しいネームサーバーが含まれています。

私のDockerホストに/etc/resolv.conf正しい情報が含まれています。

コンテナを次のように実行します。

docker run -itd --cap-add=NET_ADMIN --device /dev/net/tun \
-v /home/pi/share/ovpn:/ovpn \
--privileged --network=internet_disabled --name vpn-client \
--dns=208.67.222.222 \
openvpn-client_nat-gateway /bin/bash

それにもかかわらず、コンテナは次のような出力を提供します。

root@642b0f4716ba:/# cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

コンテナ内で(またはdocker execを使用して)resolv.confを手動で変更した後にのみ正しく表示されます。

問題を解決するためにexecコマンドを使用しないようにしたいと思います。ここで何が起こっているのか知っている人はいますか?

答え1

AFAIK、dockerは画像の一部のファイルを上書きします。ここに行く、Dockerfileに追加された場合も同様です。これには確かに含まれており、/etc/hostsおそらく同じことが起こります/etc/resolv.conf。これは明らかにDockerのデフォルトの「内部」ネットワークを正しく構築するために使用されます(したがって、画像は互いに見えますが、ホストは見えません)。とても確信していますこれらのファイルの一部を上書きまたは変更するには、実行時タスクの一部(この行の一部など)でCMD実行する必要があると思います。たとえば、

...
ADD resolv.conf /etc/resolv.conf.override
CMD cp /etc/resolv.conf.override /etc/resolv.conf && \
        your_old_commands...

答え2

ご覧のとおり、user-defined networksDockerエンジンのバージョン> = 1.10を使用しています。したがって、公式ドッカーエンジンのドキュメントからEmbedded DNS server in user-defined networks

これらの --dns IP アドレスは組み込み DNS サーバーによって管理され、コンテナの /etc/resolv.conf ファイルでは更新されません。

あなたのDNSは機能するはずですが、どの設定ファイルにも表示されません。

引用する

答え3

Azure にコンテナ化された Web アプリケーションの場合、この問題を解決しました。

持つコンテナコンパニオン2個。クドゥとマスター

スピード

1. dockerファイルからsshをインストールする(sshd設定も含む)

2. Containerstart.shを作成します(resolv.confを更新します)。

3.そこにエントリポイントを設定してください

これでホスト resolv.conf が更新され、必要な DNS を使用できるようになりました。

PS:ネットワークからカスタムDNSを取得できない場合でも心配しないでください。私たちも同じです。 ASE環境を使用している場合は、リセットが必要な場合があります。

関連情報