web-dev-qa-db-ja.com

「docker build」中にDockerイメージの/ etc / hostsファイルを更新する方法

「docker build」中に/etc/hostsファイルを更新したい。

Dockerfileに以下の行を追加しましたが、/etc/hostsファイルの更新もエラーの表示もしていません。

RUN echo "192.168.33.11    mynginx" >> /etc/hosts

/etc/hostsを更新する必要があります。誰でもこれについて提案できますか?

55
Prakash

より新しいバージョンのdockerでは、これはdocker-composeとその extra_hostsディレクティブ で実行できます

ホスト名マッピングを追加します。
docker run client --add-Host parameter と同じ値を使用します(これは、Docker 1.8で既に使用可能になっているはずです)。

extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"

要するに、コンテナをビルドするのではなく、実行するときにコンテナの/etc/hostsを変更します。


Docker 17.x +では、 docker build --add-Host が言及されています below が、 、 issue 34078 および this answer でコメントされているように:

ビルド中の--add-Host機能は、ビルド中にホストを上書きできるように設計されていますが、その構成をイメージに保持することはできません。

上記の解決策は、上記で提案したdocker-composeを参照しています。

  • 内部DNSを実行します。デーモンで使用するデフォルトのDNSサーバーを設定できます。こうすることで、起動されたすべてのコンテナはデフォルトで設定されたDNSを自動的に使用します
  • Docker composeを使用して、開発者にdocker-compose.ymlを提供します。
    Docker作成ファイルを使用すると、コンテナを起動するときに使用するすべてのオプションを指定できるため、開発者は、設定する必要があるすべてのオプションでコンテナを起動するためにdockerを作成できます。
86
VonC

echoステップでRUNを使用してイメージ内のHostファイルを変更することはできません。これは、イメージからコンテナーを開始するときにdockerデーモンがファイル(/ etc/hosts)とそのコンテンツ(hostsエントリー)を維持するためです。

ただし、以下を使用して同じことを実現できます。

ENTRYPOINT ["/bin/sh", "-c" , "echo 192.168.254.10   database-server >> /etc/hosts && echo 192.168.239.62   redis-ms-server >> /etc/hosts && exec Java -jar ./botblocker.jar " ]

ここで注意すべき重要な点は、dockerのドキュメントが示唆するようにexecコマンドを使用することです。 execを使用すると、JavaコマンドがコンテナのPID 1として作成されます。 Docker割り込みはそれにのみ応答します。

https://docs.docker.com/engine/reference/builder/#entrypoint を参照してください

18
Shubham Singh

Dockerは--add-Hostフラグをdockerビルドに最近追加したと思いますが、これは本当に素晴らしいです。

[編集]この機能は 17.04.0-ce で更新されました

docker build--add-Hostフラグとともに使用する方法の詳細については、以下を参照してください。 https://docs.docker.com/Edge/engine/reference/commandline/build/

14
Bill Cheng

これはまだGoogleの最初の回答として浮上しているので、可能な解決策を提供します。

here から取ったコマンドは、驚くほどうまく機能しました(Docker 1.13.1、Ubuntu 16.04):

docker exec -u 0 <container-name> /bin/sh -c "echo '<ip> <name> >> /etc/hosts"
8
Remy

これが誰にとっても有用であれば、HOSTALIASES env変数は私のために働いた:

echo "fakehost realhost" > /etc/Host.aliases
export HOSTALIASES=/etc/Host.aliases
2
user10805445

Dockerの実行時に次のコマンドを実行できます

docker run [OPTIONS] <your-image-name>:<your tag> --add-Host example.com:127.0.0.1

ここで、example.comをlocalhost 127.0.0.1にマッピングし、その動作を確認しています。

1
Asad Shakeel

AWS Elasticbeanstalk + Docker + Supervisordを使用しています。

素早い回答

Dockerfileにコードを追加するだけです。

CMD echo 123.123.123.123 this_is_my.Host >> /etc/hosts; supervisord -n;
0
Jay Lim
Tis is me Dockefile
FROM XXXXX
ENV DNS_1="10.0.0.1 TEST1.COM"
ENV DNS_1="10.0.0.1 TEST2.COM" 
CMD ["bash","change_hosts.sh"]`

#cat change_hosts.sh
su - root -c "env | grep DNS | akw -F "=" '{print $2}' >> /etc/hosts"
  • 情報
  • ユーザーはsu
0
Name Last