Alpine Linux の Docker イメージで動的に環境変数を設定するベストプラクティス
2021.11.27 - 2021.11.29
Dockerfile
を書いていると、「 aarch64
の場合だけ」のように特定の条件を満たす時に環境変数を設定したい場合がありますよね。しかし Dockerfile
としてビルド時の分岐がそもそもサポートされていないので、今回はそのような場合に有効な Dockerfile
の作成方法を紹介します。
はじめに
Dockerfile
の RUN
コマンドは、それぞれが独立したコンテキストで動作します。そのため 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 だと逆に手間
レベル別プログラマの特徴まとめ
独断と偏見で、プログラマをレベル付けして特徴をまとめました。
Docker の Redis イメージに初期データをロードするベストプラクティス
ローカル環境で動作を確認しながら開発していると、サクッとデータベースに接続したくなるタイミングが割とすぐに来ますよね。AWS などの PaaS で立ち上げても良いのですが、やはりローカル開発ならローカルで済むに越したことはありません。さらに、頻繁にデータを入れ替えたりする場合は AWS だと逆に手間