2017-08-26 15 views
2

私は非常に特別なシナリオを持っています。いくつかのドッカーコンテナを含む仮想マシン。このコンテナの1つは、ホストのIPを知る必要があります。問題は、コンテナの構築時にホストipを渡すか、ドッカーの実行コマンドで-eを使用すると、コンテナに「静的」(常に同じ、その瞬間の1つ)のままです。ドッカー。コンテナーのenv varに動的ホストipを追加してください。

そのVMはラップトップに置くことができ、ラップトップは異なるネットワークから移動しており、VMホストIPはリブートごとに異なる場合があります。

この特別なコンテナは--restart=alwaysであり、もう一度ビルドまたは「ドッカー実行」されません。そして、私が言ったように、コンテナにはバインドDNSサーバーがあり、ゾーン(ホストのIPアドレスを指し示す必要があります)をロードする必要があるため、コンテナ内部のサービスを設定するために、 )。可能であれば、環境変数varは素晴らしいでしょう。

  • 「ノーマル」

私Dockerfileの終わりを出せ:これらは私のデータで

.... 
.... 
ENTRYPOINT ["/etc/bind/entrypoint.sh"] 
CMD ["/usr/sbin/named", "-g", "-c", "/etc/bind/named.conf", "-u", "bind"] 

エントリポイントファイル(varが右の値を持つことができれば正規表現が正常に動作します):

#!/bin/bash 
sed -ri "s/IN A.*/IN A $HOSTIP/" /etc/bind/db.my.zone 
exec "[email protected]" 

ドッカーの実行CMD:

私が試した何
docker run --name myContainer -d --restart=always -p 53:53 -p 53:53/udp myImage 

私は、エントリポイントがOKであると私はそれに正しい値を持つVARを提供できるかどう修正すべきではないと思います。

私はドッキングウィンドウrunコマンドで-eを置く場合、それはホストが異なるネットワーク上にある場合でも、常に同じIPで永遠に「ハードコードさ」である。

docker run -e HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}') --name myContainer \ 
-d --restart=always -p 53:53 -p 53:53/udp myImage 

私はDockerfileにCMDを修正することも失敗してみました:

CMD (export HOSTIP=$(ifconfig eth0 | grep netmask | awk '{print $2}'));/usr/sbin/named -g -c /etc/bind/named.conf -u bind 

このようなことは可能ですか?ありがとう。

答えて

0

私はついにそれを解決しました。あなたの答えのために@ yamenkありがとう、それは私にupvoting、アイデアを与えた。

は、最後に私がやったこと:

  • 私は、ホストのIPを取得し、別のファイルにそれを足すされているホスト上の簡単なスクリプトを作成しました。
  • ドッカーが起動する前に、すべてのホストの起動時に起動するようにスクリプトを設定しました。
  • ドッカーの実行コマンドで-vを使用して、ipを使用してファイルをコンテナにマップしました。
  • 私はIPを含有し、作業に必要なコンテナの設定ファイルのsed

すべてを修正そのファイルからIPアドレスを取得するために私のエントリポイントを設定!別のネットワーク上でvm(ホストマシン)を起動すると、ipを取得し、新しいipで始まる前にコンテナを再構成することができます。

2

開いているすべてのソケットを表示するホストマシン上にファイル/proc/net/tcpがあります。特に、2番目の列はホストインタフェースのlocal_addressです。

この列の値は、リトルエンディアンの4バイトの16進数として格納されます。あなたのコンテナの起動時にIPアドレスにこれらを変換するにはhere

を見てこのように、あなたは、コンテナ-v /proc/net/tcp:/host-tcp上にホストからこのファイルをマウントし、常にこのファイルに反映されますホストのIPアドレスを読み取ることができます。

+0

私はそれが私にボリュームファイルをマッピングするアイデアを与えたので、それをアップアップしました。あなたのメソッド '/ proc/net/tcp'は私にとってはうまくいかなかったが、あなたの考えは良い。私は私のソリューションを投稿します。ありがとうございました。 – OscarAkaElvis

関連する問題