logo
github
cover-image

Alpine Linux の Docker イメージで動的に環境変数を設定するベストプラクティス

2021.11.27 - 2021.11.29

Dockerfile を書いていると、「 aarch64 の場合だけ」のように特定の条件を満たす時に環境変数を設定したい場合がありますよね。しかし Dockerfile としてビルド時の分岐がそもそもサポートされていないので、今回はそのような場合に有効な Dockerfile の作成方法を紹介します。

はじめに

DockerfileRUN コマンドは、それぞれが独立したコンテキストで動作します。そのため RUN コマンド内で export した環境変数が、 それ以外の RUN コマンドの環境変数に影響することはありません。後述では shell の初期化機構を利用して RUN コマンドを跨いで環境変数を設定する方法を紹介します。

また、今回は Alpine Linux の ash を例に紹介していますが、 bash などの場合でも基本的な考え方は非常に似ているので、 ~/.bashrc などの利用を検討してみてください。

ベストプラクティス

ログインせずに環境変数を設定する場合

Alpine などの Dockerfile ではこれが一般的ですね。

docker
FROM alpine:latest # '-i' でインタラクティブモードを有効化しないと初期化シェルをロードできないので注意 SHELL [ "/bin/sh", "-i", "-c" ] # '-i' でロードする環境変数を含んだ初期化シェルを指定 ENV ENV /root/.shinit # '.shinit' に環境変数を追記 RUN echo 'export TEST_ENV=test-env-value' >> ~/.shinit # ルートユーザの環境変数をチェック RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /root/env.txt # /root/env.txt # User : root # Env : test-env-value # その他ユーザの環境変数をチェック RUN adduser -S other USER other RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /home/other/env.txt # /home/other/env.txt # User : other # Env : USER root CMD less /root/env.txt /home/other/env.txt

ログインユーザ全員に環境変数を設定する場合

docker
FROM alpine:latest # '-l' でログインモードを有効化しないと初期化シェルをロードできないので注意 SHELL [ "/bin/sh", "-l", "-c" ] # '/etc/profile' に環境変数を追記 RUN echo 'export TEST_ENV=test-env-value' >> /etc/profile # ルートユーザの環境変数をチェック RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /root/env.txt # /root/env.txt # User : root # Env : test-env-value # その他ユーザの環境変数をチェック RUN adduser -S other USER other RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /home/other/env.txt # /home/other/env.txt # User : other # Env : test-env-value USER root CMD less /root/env.txt /home/other/env.txt

ログイン中のユーザ別に環境変数を設定する場合

docker
FROM alpine:latest SHELL [ "/bin/sh", "-l", "-c" ] RUN echo 'export TEST_ENV=test-env-value-A' >> /root/.profile RUN adduser -S other RUN echo 'export TEST_ENV=test-env-value-B' >> /home/other/.profile # Checks the environment variable of the root user. RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /root/env.txt # /root/env.txt # User : root # Env : test-env-value-A # Checks the environment variable of the other user. USER other RUN echo -e "User : $(whoami)\nEnv : $TEST_ENV" > /home/other/env.txt # /home/other/env.txt # User : other # Env : test-env-value-B USER root CMD less /root/env.txt /home/other/env.txt

参考リンク

docker-examples/dynamic-environment at main · laziness-works/docker-examples · GitHub
Skip to content You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab...
No Image
Dockerfile reference | Docker Docs
{ const container = $el; // The div with overflow const item = document.getElementById('sidebar-current-page') if (item) { const containerTop = container.scrollTop; const containerBottom = containerT...
No Image
busybox/shell/ash.c at 836b79211df3aeaba1b8b65c6db5ee6193172cc0 · mirror/busybox · GitHub
Skip to content You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab...
No Image

Related posts

Docker の Redis イメージに初期データをロードするベストプラクティス
ローカル環境で動作を確認しながら開発していると、サクッとデータベースに接続したくなるタイミングが割とすぐに来ますよね。AWS などの PaaS で立ち上げても良いのですが、やはりローカル開発ならローカルで済むに越したことはありません。さらに、頻繁にデータを入れ替えたりする場合は AWS だと逆に手間
thumbnail
レベル別プログラマの特徴まとめ
独断と偏見で、プログラマをレベル付けして特徴をまとめました。
thumbnail
Docker の Redis イメージに初期データをロードするベストプラクティス
ローカル環境で動作を確認しながら開発していると、サクッとデータベースに接続したくなるタイミングが割とすぐに来ますよね。AWS などの PaaS で立ち上げても良いのですが、やはりローカル開発ならローカルで済むに越したことはありません。さらに、頻繁にデータを入れ替えたりする場合は AWS だと逆に手間
thumbnail