ホスト名に基づいてDockerファイルにENV varを設定するにはどうすればよいですか?私はこの試みた:条件付きでDockerfileのホスト名に基づいてENV varを設定します
RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi
をしかし、それは
で失敗しましたENV: not found
ホスト名に基づいてDockerファイルにENV varを設定するにはどうすればよいですか?私はこの試みた:条件付きでDockerfileのホスト名に基づいてENV varを設定します
RUN if [ hostname = "foo" ]; then ENV BAR "BAZ"; else ENV BAR "BIFF"; fi
をしかし、それは
で失敗しましたENV: not found
実行した場合、[ホスト名= "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"]
まず、あなたは埋め込むことはできませんDockerビルドコマンドをRUN
にすると、シェルはビルドプロセス中に中間コンテナ内で実行され、DockerビルドコマンドはDockerビルドエンジンによって実行されます。さらに、DockerはIF
などの条件付きコマンドをサポートしていません。 Dockerは不変のインフラストラクチャに関するもので、Dockerfileはイメージの定義であり、ビルドコンテキストが何であっても同じイメージを生成できるはずです。また、配信の観点から見ると、イメージは配信可能なビルド成果物です別のものを配信したい場合は別のDockerfileを使用して別のイメージを作成してください。そうでない場合はランタイムについての違いがある場合はenv
の定義を実行時に-e
のオプションdocker run
で延期することが考えられます。
@ 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
をしかし、ホスト名は、コンテナのランダムホスト名になります - これは仕事に行くことはありません。.. 。 –
しかし、私はあなたが望むものがビルドargsと思われます:https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables---build-arg –
私は同じことをします'ln -s'のような他のコマンドを使っているとうまく動作します。 –