私は単純なDockerfileを持っていますが、最初のRUNコマンド(/ etc/hostsにホストIPアドレスを追加する)は効果がありません
FROM dockerfile/Java
RUN Sudo echo "XX.XX.XXX.XXX some.box.com MyFriendlyBoxName" >> /etc/hosts
ADD ./somejavaapp.jar /tmp/
#CMD Java -jar /tmp/somejavaapp.jar
EXPOSE 8280
私は使用して構築します
docker build .
次に、RUNエコーラインを使用して機能していることをテストします
Sudo docker run -t -i <built image ID> /bin/bash
次にコンテナに入りますが、/ etc/hostsファイルは追加されていません。同じエコーを実行すると、コンテナ内で目的の効果が得られます。
私のdockerfile RUNのどこが悪いのか誰かに教えてもらえますか?
Dockerは、新しいコンテナを作成するたびに動的に/etc/hosts
を生成します。他をリンクできるように。 --add-Host
オプションを使用できます。
docker run --add-Host www.domain.com:8.8.8.8 ubuntu ping www.domain.com
Docker-composeを使用する場合は、 extra_hosts を使用します。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
1つのIPに複数のドメイン名を追加したいという問題がありました。実際には、イメージを実行するたびに/ etc/hostsが上書きされるため、ビルド時に作成する方法はありません。したがって、docker-composeメソッドで--add-Hostオプションまたはそのextra_hostsエイリアンを利用することが唯一の方法のようです。しかし、実際のところ、単一の--add-Hostを使用して各ドメイン名を追加するのは、とても面倒でした。私は以下のものを試しましたが、うまくいきます:
docker run --add-Host "some.box.com MyFriendlyBoxName":X.X.X.X ubuntu cat /etc/hosts
実際には、それは--add-Hostの後の文字列をコロンにコピーして貼り付けるだけです。
ホストマシンとコンテナの間でホストファイルエントリを維持しようとしている場合、別の方法として、ホストの/etc/hosts
を--add-Host
パラメータにマップするシェルスクリプトでコマンドをラップすることができます。
~/bin/Java
:
#!/bin/sh
ADD_HOSTS=$(tail -n +10 /etc/hosts | egrep -v '(^#|^$)' | sed -r 's/^([a-z0-9\.\:]+)\s+(.+)$/--add-Host="\2:\1"/g')
eval docker run \
-it \
--rm \
$ADD_HOSTS \
<image> \
Java $*
return $?
明らかにJavaをあなたがやろうとしていることで置き換えてください...
説明; ADD_HOSTS
は、ホストの/etc/hosts
ファイルの最初の10行以降すべてを取得します|
コメントと空白行を削除します|
エントリを--add-Host
paramsに並べ替えます。
最初の10行の後ですべてを取得する理由は、ホストマシンのlocalhostおよびipv6エントリを除外するためです。必要に応じてこれを調整する必要がある場合があります。