docker ENV変数をコマンドの結果に設定することは可能ですか?お気に入り:
ENV MY_VAR whoami
MY_VARに値「root」またはwhoamiが返すものを取得させたい
回答:
DarkSideFの答えに加えて。
Dockerfileの各行/コマンドは別のコンテナで実行されることに注意してください。
あなたはこのようなことをすることができます:
RUN export bleah=$(hostname -f);echo $bleah;
これは単一のコンテナーで実行されます。
$bleah
ではないではないとしても、同じdockerfileの次の行に、このRUNコマンド外で利用できるどこでも、それはオフに基づいている別の画像にはおろか。ここのdockerには本当に明らかな欠落している機能があります。ファイルへの書き込みとファイルからの読み取りが、実際に(動的)変数を画像に格納して画像間で渡す唯一の方法のように見えます。
同じ問題が発生し、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はそれをレイヤーとしてキャッシュし、その前にいくつかの文字列を変更した場合にのみ変更します。
環境変数を設定するさまざまな方法を試すこともできます。
*.sh
ファイルの内部には、/etc/profile.d/
環境を移入するために使用される
現時点では、コマンド結果はで使用できますRUN export
が、ENV
変数に割り当てることはできません。
この回答は@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
@DarkSideFの回答に加えてDockerfile
、ビルドプロセス中に前のコマンドの結果を再利用する場合は、次の回避策を使用できます。
例えば :
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ライブラリを使用できます。
これが探していたものかどうかはわかりませんが、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を呼び出すことです。