Dockerfile-ENVをコマンドの結果に設定します


回答:


21

DarkSideFの答えに加えて。

Dockerfileの各行/コマンドは別のコンテナで実行されることに注意してください。

あなたはこのようなことをすることができます:

RUN export bleah=$(hostname -f);echo $bleah;

これは単一のコンテナーで実行されます。


15
ただ、明確にする-$bleahはないではないとしても、同じdockerfileの次の行に、このRUNコマンド外で利用できるどこでも、それはオフに基づいている別の画像にはおろか。ここのdockerには本当に明らかな欠落している機能があります。ファイルへの書き込みとファイルからの読み取りが、実際に(動的)変数を画像に格納して画像間で渡す唯一の方法のように見えます。
davnicwil

17

同じ問題が発生し、dockerfileでRUNコマンドを使用して、関数の結果として環境変数を設定する方法を見つけました。

たとえば、RailsアプリのSECRET_KEY_BASEを、実行時のように変更せずに1回だけ設定する必要があります。

docker run  -e SECRET_KEY_BASE="$(openssl rand -hex 64)"

代わりに、次のようにDockerfile文字列に書き込みます。

RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'

そして、bashログイン後でも、ルートから環境変数を利用できます。または多分

RUN /bin/bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh'

次に、CMDおよびENTRYPOINTコマンドで使用可能な変数

Dockerはそれをレイヤーとしてキャッシュし、その前にいくつかの文字列を変更した場合にのみ変更します。

環境変数を設定するさまざまな方法を試すこともできます。


/etc/profile.d/docker_init.shはまだ問題ですか?この答えは私がグーグルで見つけることができるそれの唯一の言及であり、それは私にとってはうまくいきません。2016年に現在ではなくなったDocker実行エンジンの一部だったのでしょうか。
SIGMAX

1
@SigmaXこれはDockerのことではなく、Linuxのことです。任意の*.shファイルの内部には、/etc/profile.d/環境を移入するために使用される
Madacol


7

この回答は@DarkSideFへの回答です。

彼が提案している方法は次のとおりですDockerfile

RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'

(にエクスポートを追加します/etc/bash.bashrc

それは良いことですが、環境変数はプロセス/bin/bashでのみ使用可能であり、Node.jsアプリケーションなどのDockerアプリケーションを実行しようとする/etc/bash.bashrcと、完全に無視され、アプリケーションはSECRET_KEY_BASE試行時に何が起こっているのか単一の手がかりを得ることができません。アクセスするprocess.env.SECRET_KEY_BASE

ENVコンテナを実行したりコマンドを使用したりするたびにexec、DockerはENV現在実行されているプロセスのすべての値をチェックしてパイプ処理するため(と同様-e)、キーワードが動的コマンドで使用しようとしている理由です。

1つの解決策は、ラッパーを使用することです(このgithubの問題の@duglinへのクレジット)。envwrapperプロジェクトルートに以下を含むラッパーファイル(例)を用意します。

#!/bin/bash
export SECRET_KEY_BASE="$(openssl rand -hex 64)"
export ANOTHER_ENV "hello world"
$*

そしてあなたのDockerfile

...
COPY . .
RUN mv envwrapper /bin/.
RUN chmod 755 /bin/envwrapper
CMD envwrapper myapp

4

@DarkSideFの回答に加えてDockerfile 、ビルドプロセス中に前のコマンドの結果を再利用する場合は、次の回避策を使用できます。

  1. コマンドを実行し、結果をファイルに保存します
  2. コマンド置換を使用して、そのファイルから別のコマンドに前の結果を取得します

例えば ​​:

RUN echo "bla" > ./result
RUN echo $(cat ./result)

よりクリーンなものについては、次の要点を使用することもできます。これは、次のような小さなCLIを提供しますenvstore.py

RUN envstore.py set MY_VAR bla
RUN echo $(envstore.py get MY_VAR)

または、同様のCLIを持つpython-dotenvライブラリを使用できます。


2

これが探していたものかどうかはわかりませんが、ENV変数またはARGSを.Dockerfileビルドに挿入するには、このパターンが機能します。

my_build.sh内:

echo getting version of osbase image to build from
OSBASE=$(grep "osbase_version" .version | sed 's/^.*: //')

echo building docker
docker build -f \
--build-arg ARTIFACT_TAG=$OSBASE \
PATH_TO_MY.Dockerfile \
-t my_artifact_home_url/bucketname:$TAG .

.DockerfileでARGを取得する場合、スニペットは次のようになります。

FROM scratch
ARG ARTIFACT_TAG
FROM my_artifact_home_url/bucketname:${ARTIFACT_TAG}

または、.DockerfileでENVを取得する場合、スニペットは次のようになります。

FROM someimage:latest
ARG ARTIFACT_TAG
ENV ARTIFACT_TAG=${ARTIFACT_TAG}

アイデアは、シェルスクリプトを実行し、ビルドのオプションとして渡された引数を使用して.Dockerfileを呼び出すことです。

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