はじめに
エンジニアとして入社し、初めてDockerを触り始めて、
READMEに書いてある通りに
docker compose up --build を叩いて環境構築することはできました。
でも正直、
CPU_TYPE=aarch64 みたいな環境変数が出てきたとき、
「なぜここで必要なのか」はよく分からず、
おまじないのようにブラックボックス化したまま環境構築していました。
この記事の前提
この記事では、Dockerの環境変数まわりの話題のうち、
ENVとARGの違いについて、あくまで一例として触れます。
ENVとARGを正確に使い分けられるようになることが目的ではありません。
「この環境変数は、いつ効かせたいものなのか?」
という視点を持つきっかけになれば十分だと思っています。
実例
READMEに書いたビルド手順の中で、
個人的に一番よく分かっていなかったのが、次のコマンドです。
CPU_TYPE=aarch64 docker compose up --build -d
Apple Silicon(M1/M2/M3)向けの手順として書いてありますが、
正直、
-
CPU_TYPEって何? - なぜ
--buildと一緒に指定しているのか? - 毎build時必要なのか、最初だけでいいのか?
といったことは深く考えず、
ただ「書いてあるから実行する」状態でした。
環境変数は「いつ使われるか」で見る
さっきのコマンドを見ていて分からなかった理由を、
あとから振り返ると一つにまとめられます。
それは、
「この環境変数が、いつ使われるものなのか」
を意識していなかったことでした。
Dockerには大きく分けて、
- イメージを作るタイミング
- コンテナを動かすタイミング
の2つがあります。
docker compose up --build は、
この2つをまとめてやってくれる便利なコマンドですが、
その分、環境変数がどのタイミングで使われているのかが
分かりにくくなります。
この視点で見ると、ENVとARGはこう見える
「環境変数は、いつ使われるかで見る」という前提に立つと、
ENVとARGの違いも少し整理して見えるようになります。
ARGは、
イメージを作るときだけ使われる環境変数です。
Dockerイメージをどう作るかを切り替えるための材料、という感覚です。
一方でENVは、
コンテナを動かしている間に使われる環境変数です。
同じイメージでも、起動の仕方を変えたいときに使われます。
細かい使い分けや書き方は一旦置いておいて、
この記事ではこのくらいの理解で十分だと思っています。
このコマンドを、もう一度見直す
ここまでの視点を踏まえて、
もう一度このコマンドを見てみます。
CPU_TYPE=aarch64 docker compose up --build -d
docker compose up --build は、
イメージを作る処理と、コンテナを起動する処理を
まとめて実行するコマンドです。
そのため、このコマンドに渡している CPU_TYPE という値も、
「どこで使われているか」ではなく、
「いつ使われているか」で考える必要があります。
この場合は、
Apple Silicon という環境に合わせて、
ビルドや起動の挙動を切り替えるための値として
渡されている、という見方になります。
まとめ
最初は、
CPU_TYPE=aarch64 docker compose up --build -d
というコマンドが、完全に「おまじない」に見えていました。
でも振り返ってみると、
分からなかった原因はシンプルで、
環境変数を「何の値か」だけで見ていて、
「いつ使われるのか」を意識していなかっただけでした。
ENVとARGの違いを正確に覚える必要はありません。
READMEを書くときに、
この値は ビルドのとき に効かせたいのか、
それとも 起動するとき に効かせたいのかを
一度立ち止まって考えられれば、それで十分だと思います。
この記事が、
Dockerの環境変数を
「よく分からないおまじない」から
「理由はありそうなもの」に変えるきっかけになれば嬉しいです。