web-dev-qa-db-ja.com

Dockerfileで変数を定義する方法

私のDockerfileの中で、私は変数を定義するできること--- Dockerfileの中で後で使うしたいと思います。

ENV命令を知っていますが、これらの変数を環境変数にしたくありません。

Dockerfileスコープで変数を宣言するする方法はありますか?

96
Maxime

ARGを使用できます - https://docs.docker.com/engine/reference/builder/#arg を参照してください

ARG命令は、ユーザーがdocker buildフラグを使用して--build-arg <varname>=<value>コマンドを使用してビルド時にビルダーに渡すことができる変数を定義します。 Dockerfileで定義されていないビルド引数をユーザーが指定した場合、ビルドはエラーを出力します。

79
lumos0815

私の知る限りでは、 " 環境の置き換え "で述べたように、ENVだけがそれを許可しています

環境変数(ENVステートメントで宣言)は、Dockerfileによって解釈される変数として特定の命令で使用することもできます。

docker buildによってDockerfileの各行用に作成されたそれぞれの新しいコンテナで再宣言されるために、それらは環境変数である必要があります。

言い換えれば、これらの変数はDockerfile内で直接解釈されるのではなく、Dockerfile行用に作成されたコンテナ内で解釈されるため、環境変数が使用されます。


今日は、 ARGdocker 1.10+、およびdocker build --build-arg var=value )と ENV の両方を使用しています。
ARGを単独で使用すると、変数はビルド時に表示され、実行時にはnotになります。

私のDockerfileには通常以下のものがあります。

ARG var
ENV var=${var}

あなたの場合はARGで十分です:私は通常http_proxy変数を設定するためにそれを使います、そのdockerビルドはビルド時にインターネットにアクセスするために必要です。

42
VonC

あなたの質問に答えるには:

私のDockerfileでは、後でDockerfileで使用できる変数を定義したいと思います。

変数を定義することができます:

ARG myvalue=3

等号を囲むスペースは使用できません。

そして後でそれを使う

RUN echo $myvalue > /test
15
Ortomala Lokni

変数が同じRUN命令内で再使用される場合は、単にシェル変数を設定することができます。私は彼らが 公式のRuby Dockerfile でこれに近づいた方法が本当に好きです。

10