2017-04-14 5 views
0

ホスト名に基づいてDockerファイルにENV varを設定するにはどうすればよいですか?私はこの試みた:条件付きでDockerfileのホスト名に基づいてENV varを設定します

RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi 

をしかし、それは

で失敗しました
ENV: not found 
+0

をしかし、ホスト名は、コンテナのランダムホスト名になります - これは仕事に行くことはありません。.. 。 –

+1

しかし、私はあなたが望むものがビルドargsと思われます:https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg –

+0

私は同じことをします'ln -s'のような他のコマンドを使っているとうまく動作します。 –

答えて

3

実行した場合、[ホスト名= "foo" という]。 ENV BAR "BAZ";そうでなければENV BAR "BIFF";あなたが巣のドッキングウィンドウの指示を構築することはできませんFiの

、すべてRUN命令は、画像コンテキストで実行されます後、ドッキングウィンドウのビルドコマンドが が存在しません。それはあなたが見ているエラーを説明しています。

正しいシェルコードに翻訳した場合でも、BARは、ビルド中にその単一RUN命令のためだけにアクティブになります。

いずれかのホスト上で編成し、あなたのコンテナにrun -e経由BARを渡すか、またはコンテナの起動時に、必要に応じてBARを設定した画像に起動スクリプトを追加します。すべての

FROM foo 
COPY my-start.sh/
CMD ["/my-start.sh"] 
2

まず、あなたは埋め込むことはできませんDockerビルドコマンドをRUNにすると、シェルはビルドプロセス中に中間コンテナ内で実行され、DockerビルドコマンドはDockerビルドエンジンによって実行されます。さらに、DockerはIFなどの条件付きコマンドをサポートしていません。 Dockerは不変のインフラストラクチャに関するもので、Dockerfileはイメージの定義であり、ビルドコンテキストが何であっても同じイメージを生成できるはずです。また、配信の観点から見ると、イメージは配信可能なビルド成果物です別のものを配信したい場合は別のDockerfileを使用して別のイメージを作成してください。そうでない場合はランタイムについての違いがある場合はenvの定義を実行時に-eのオプションdocker runで延期することが考えられます。

1

@ shizhz & @Erik Dannenberkによってビルドが失敗する理由が説明されています。しかし

、あなたは私はあなたがそれを行うための小さなスクリプトを作成することを示唆している行動は本当に必要ない場合:

export BAR=`[[ hostname = "foo" ]] && echo "BAZ" || echo "BIFF"` 

docker build -t hello/hi - <<EOF 
FROM alpine 
ENV BAR $BAR 
CMD echo $BAR 
EOF 
関連する問題