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


106

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

Dockerfileの以下の行を追加しましたが、/etc/hostsファイルの更新でもエラーの発生でもありません。

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

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


dockerビルドを実行するためにboot2dockerを使用していますか?
VonC 2016

いいえ、私はLinuxバージョンのdocker 1.8を使用しています。
Prakash

1
また、イメージをコンテナとして実行している場合、その/ etc / hostsは変更されませんか?または、Linuxホスト/ etc / hostsを参照していましたか?
VonC

4
docker build中にイメージが正常にビルドされますが、同じイメージを使用してコンテナーを実行し、/ etc / hostsファイルを確認したところ、変更はありませんでした。
Prakash

回答:


141

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

ホスト名マッピングを追加します。クライアントパラメーター
と同じ値を使用します(Docker 1.8で既に使用可能になっているはずです)。docker run--add-host

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

つまり/etc/hosts、ビルドではなく、実行時にコンテナを変更します。


Docker 17.x +では、以下docker build --add-hostように説明されていますが、問題34078とこの回答でコメントされています

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

前述のソリューションは、上記で提案したdocker-composeを参照しています。

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

2
Dockerイメージの/ etc / hostsを変更したい。
Prakash

1
@PrakashSingh同意するが、それは簡単ではないようだ。
VonC

1
@PrakashSinghを使用してマシンでbashインスタンスを開き、docket exec -it <container name> /bin/bash/ ect / hostの下のドッカーのコンテナホストを任意のコマンドラインエディタ(vim、emacs、nano、echo ''。>> />)で更新できます。
NateAGeek

@PrakashSinghはい、できます(おなじみの音...)。しかし、コンテナーを実行するのではなく、イメージを作成してホストのエントリーを変更すると、Dockerは一種のハックのように見えます。Dockerネットワーク設計はアプリケーション駆動型です(docker.comから)。hostsエントリーはDockerネットワークの一部であるため、イメージからコンテナーを実行するときに定義する方が適切です。本当にホストエントリを追加する必要がある場合は、毎回イメージをビルドして追加するのではなく、一度ベースイメージに追加します。それがベストプラクティスです。
Light.G

2
docker build --add-host:cran.rstudio.com:<IPaddress>中のrocker / shiny install.packagesの問題を解決するために問題が解決しました。
bvanlew

25

イメージからコンテナを起動すると、Dockerデーモンはファイル(/ etc / hosts)とその内容(ホストエントリ)を維持するためechoRUNステップを使用してイメージ内のホストファイルを変更することはできません。

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

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 " ]

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

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


ty!これは素晴らしいソリューションです
ゼロ

1
kubenetesソリューションを探している場合は、hostAliasesを使用できます。kubernetes.io/docs/concepts/services-networking/…docker compose extra_hostsと同じように。
Shubham Singh 2017

より正確にENTRYPOINTは、画像の指示ではありません。このイメージからコンテナーを実行するときにのみエントリーポイントをマークします。つまり、ホストエントリーはコンテナーの実行後にのみ存在します。要件は必須ではないと思います。誤解があるに違いない。
Light.G 2018

17

dockerは最近--add-hostdocker buildにフラグを追加したと思います。これは本当に素晴らしいことです。

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

使用方法の詳細についてはdocker build--add-hostご覧くださいフラグ:https://docs.docker.com/edge/engine/reference/commandline/build/


1
この--add-host機能は、CentOS上のDocker 12で利用できます。
チャッツ

1
「このフラグで追加されたホストは、ビルド中にのみ使用されます。意図的にイメージに永続化すべきではありません」github.com/moby/moby/issues/34078
Sida Zhou

10

これはまだGoogleの最初の答えとして出てくるので、可能な解決策を提供します。

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

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

関連性はありませんが、それでも価値があります。どうも。
Light.G

4

これが誰にとっても便利であれば、HOSTALIASESenv変数は私にとってはうまくいきました:

echo "fakehost realhost" > /etc/host.aliases
export HOSTALIASES=/etc/host.aliases

3
dockerとkubernetesを混同していませんか?ドッカーのドキュメントにHOSTALIASES変数が表示されません
Adrien Lemaire

4

docker実行時に以下のコマンドで行えます

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

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


3

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

素早い回答

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

CMD echo 123.123.123.123 this_is_my.host >> /etc/hosts; supervisord -n;

1

完全な回答

  1. hostsDockerコンテナーに追加する独自のファイルを準備します。
1.2.3.4 abc.tv
5.6.7.8 domain.xyz
1.3.5.7 odd.org
2.4.6.8 even.net
  1. hosts次の行を追加して、ファイルをコンテナにコピーします。Dockerfile
COPY hosts /etc/hosts_extra
  1. あなたが使用する方法を知っている場合ENTRYPOINTか、CMDまたはCRONジョブがそれにか、少なくとも次のコマンドラインを実行している組み込むコンテナ内でこれを実行します。
cat /etc/hosts_extra >> etc/hosts;
  1. Dockerfile変更が失われるため、に以下を追加することはできません。
RUN cat /etc/hosts_extra >> etc/hosts;

0

--add-hostを使用できますdockerの実行中にオプションを。

あなたのケースの使用について: docker run --add-host mynginx:192.168.33.11 [image_name]:[tag]

これはあなたを更新します / etc / hosts

次のコマンドを使用して確認できます。

  • docker exec -it [container_id] sh

shがうまくいかない場合は、bashまたは/ bin / shまたは/ bin / bashを試すことができます

  • CDなど
  • 猫のホスト

-1
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でなければなりません

-2

ドッカーのビルドではなくドッカーの実行中にファイルをマウントすることで、私のために働いた

docker service create --name <name>  --mount type=bind,source=/etc/hosts,dst=/etc/hosts   <image>

ボリュームを使用してファイルを追加すると、複雑さが増し、すべてのホストにファイルが必要になります。
Shubham Singh

-11

コンテナーを実行するための簡単な答え:

docker exec -it <container name> /bin/bash

コンテナが開いたら:

cd ..

その後

`cd etc`

そして、あなたはできる

cat hosts

または:

apt-get update
apt-get vim

または好きなエディターをvimで開きます。ここで、スタートアップIPを0.0.0.0に変更できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.