Dockerfileで変数を定義する方法は?


155

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

ENV指示は承知していますが、これらの変数を環境変数にしたくありません。

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



@ lumos0815、私はあなたがそれをあなたの答えとして投稿すべきだと思います(それは古い投稿ですが、後世のためです)それがまさにOPが求めているものなのでです。
2016年

ARGは、dockerfile内で使用できる変数を定義していません。あなたが探しているものを取得するには、それをENVコマンドと組み合わせる必要があります。ARG foo; ENV FOO = $ foo; COPYファイル$ foo(形式が
正しく

回答:


111

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

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


@MargachChrisはCOPYの変数を使用できるはずです
lumos0815

COPYコマンドでは機能しないようです。docs.docker.com/engine/reference/builder/#arg
femibyte

54

私の知る限りENV、「環境の置換」で述べたように、それだけを許可します

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

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

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


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

私のDockerfileは通常以下を持っています:

ARG var
ENV var=${var}

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


51

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

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

変数は次のように定義できます。

ARG myvalue=3

等号の前後のスペースは許可されていません。

そして、後でそれを使用します:

RUN echo $myvalue > /test

13

変数が同じRUN命令内で再利用される場合、シェル変数を設定するだけで済みます。私は彼らが公式のRuby Dockerfileでこれにどのように取り組んだかを本当に気に入っています。


すばらしい答えです。可能であればARGを使用する必要がありますが、動的変数を割り当てて再利用する必要がある場合があります。例:RUN foo=$(date) && echo $foo
wisbucky

3

を使用できARG variable defaultValue、runコマンドの実行中に、を使用してこの値を更新することもできます--build-arg variable=value。これらの変数をdockerファイルで使用するには$variable、runコマンドのように参照できます。

注:これらの変数は、Linuxコマンドなどで使用できRUN echo $variable、イメージ内に保持されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.