第08章:環境変数(env)で設定を切り替える🎚️🐳
この章でできるようになること✅✨
- 設定を コードに直書きせず、起動時に“外から”切り替えられるようになる🙌
-e/--env-fileを使って、開発モード / 本番モードみたいな切り替えができる😆- 「コンテナの中では、今どの設定になってる?」を その場で確認できる👀🔍
1) 環境変数って何?超ざっくり説明🧠✨
環境変数は、アプリに渡す “設定のつまみ” みたいなもの🎚️ たとえば…
APP_MODE=dev→ ログを増やす🪵✨PORT=3000→ 待ち受けポートを変える🚪🔢FEATURE_X=true→ 機能をON/OFFする🎛️
ポイントはこれ👇 「設定は外、ロジックは中」 にすると、あとで困りにくい😄👍
2) まずは超ミニ実験:-e で値を渡してみる🎈
Dockerは docker run に -e(=--env)を付けるだけで、コンテナ内に環境変数を渡せるよ🎁
さらに --env-file でファイルからまとめて読み込みもできる📄✨ (Docker Documentation)
2-1) “echoで見る”最短コース⚡
docker run --rm -e HELLO=world ubuntu bash -lc 'echo $HELLO'
world が出たら成功🎉
(コンテナの中では $HELLO が見えてるってこと!)
2-2) Nodeで読む(process.env)👀🟩
Nodeは process.env で環境変数が読めるよ🧩 (Node.js)
docker run --rm -e APP_MODE=dev node:lts node -e "console.log(process.env.APP_MODE)"
dev が出たらOK🎉
2026/02時点だと、Nodeは v24がActive LTS、v25がCurrent みたいな状況になってるので、迷ったら
node:ltsが安心寄り😄🛟 (Node.js)
3) --env-file で “設定セット” を丸ごと切り替える📄🎛️
3-1) envファイルを作る✍️
プロジェクトの適当な場所に env.dev を作る(名前は自由)😊
## env.dev
APP_MODE=dev
LOG_LEVEL=debug
FEATURE_STATS=true
3-2) envファイルを読み込んで起動する🚀
docker run --rm --env-file ./env.dev node:lts node -e "console.log(process.env)"
Dockerの --env-file は KEY=value 形式で、# でコメントが書けるよ(行頭 # はコメント扱い)📝 (Docker Documentation)
4) 「今どうなってる?」をコンテナの中で確認する👀🔦
環境変数は “渡したつもり” が一番こわい😇 だから 中で確認できるようになると強い💪✨
4-1) いったん起動しっぱなしにする🛌
docker run -d --name envdemo --env-file ./env.dev ubuntu sleep infinity
4-2) 中で環境変数を見る🔍
docker exec envdemo env | grep -E 'APP_MODE|LOG_LEVEL|FEATURE_STATS'
4-3) 後片付け🧹
docker rm -f envdemo
-eや--env-fileは、Dockerfileで設定したENVを上書きできるよ(=起動時が強い)💡 (Docker Documentation)
5) Todo APIに効く!環境変数“設計の型”🧩📦
ここからが本番😆✨ Todo APIでよくある環境変数セット例👇
PORT… APIの待ち受け(例: 3000)🚪APP_MODE…dev/prodなど🎭LOG_LEVEL…debug/info/warn/error🪵- (DBを使うなら)
DB_HOST/DB_PORT/DB_USER/DB_PASSWORD/DB_NAME🗄️
5-1) TypeScript側は「読む場所」を1か所に集める🧠✨
設定読み取りが散らばると、あとで泣く😭
config.ts みたいな1ファイルに集約するとスッキリするよ🧼
// src/config.ts
const get = (key: string, def?: string) => {
const v = process.env[key];
if (v === undefined || v === "") {
if (def !== undefined) return def;
throw new Error(`Missing env: ${key}`);
}
return v;
};
const getInt = (key: string, def?: number) => {
const raw = process.env[key];
if (raw === undefined || raw === "") {
if (def !== undefined) return def;
throw new Error(`Missing env: ${key}`);
}
const n = Number(raw);
if (!Number.isFinite(n)) throw new Error(`Invalid number env: ${key}=${raw}`);
return n;
};
export const config = {
port: getInt("PORT", 3000),
appMode: get("APP_MODE", "dev"),
logLevel: get("LOG_LEVEL", "info"),
featureStats: get("FEATURE_STATS", "false") === "true",
};
- 全部文字列で来る → 数字/真偽値はパースが必要🧩
- 必須のやつは 無かったらエラー にして、早めに気づく🚨✨
5-2) .env.example を置く(未来の自分を助ける)🛟📄
## .env.example
PORT=3000
APP_MODE=dev
LOG_LEVEL=info
FEATURE_STATS=false
これがあるだけで、「何が必要?」が一瞬で伝わる😆👍
6) 2026の小ネタ:Nodeは --env-file でも読める📄🟩✨
Dockerだけじゃなく、Node自体にも .env を読むCLIオプションがあるよ!
node --env-file=... / --env-file-if-exists=... みたいに使える🧠 (Node.js)
node --env-file=.env node_script.js
ローカル実行でも「環境変数セットし忘れ」事故が減る😄👍
7) ありがち失敗あるある🪤😵💫(先に潰す!)
.envをGitにコミットしちゃう ☠️ →.gitignoreに入れる!&配布は.env.exampleにする📄✨- 値に空白や
#が混ざる 🤯 →--env-fileは#の扱いが独特で、行頭はコメントだけど、途中の#は値扱いになったりする(仕様)🧠 (Docker Documentation) PORTを数字だと思い込む 🔢 → 環境変数は基本文字列。Number()で変換してチェック✅- Dockerfileに秘密情報を焼き込む 🔥
→
ENVは便利だけど、イメージに残すのは危ない方向になりがち。基本は起動時に渡すのが安全寄り🙈 (DockerfileのENV自体の使い方はここでOK、ただ“秘密”は別扱いにするのがコツ)(Docker Documentation)
8) AI活用レシピ🤖✨(そのまま投げてOK)
- 「Todo APIに必要な環境変数候補を、必須/任意 に分けてリスト化して。ついでにデフォルト案も」📋
- 「この
config.tsをレビューして、落とし穴(型、未設定、文字列問題) を指摘して」👀 - 「
.env.exampleをconfig.tsから自動生成するなら、どういうルールが良い?」🧠 - 「
APP_MODEによってログの出し分け設計、初心者向けに最小で提案して」🪵✨
9) ミニ課題🎯(5〜10分)
課題A:モード切り替え🎭
env.devとenv.prodを作るAPP_MODEとLOG_LEVELを変えるdocker run --env-file ...で起動して、Nodeで表示内容を変える😆
例:
devのときは「デバッグ情報も出す」🪵prodのときは「最小だけ」🧼
まとめ🎉
- 環境変数は「設定のつまみ」🎚️
- Dockerは
-e/--env-fileで簡単に渡せる📦✨ (Docker Documentation) - “渡したつもり” を防ぐために、
docker exec ... envで中を確認できると強い👀💪 - Todo APIでは
config.tsに集約すると設計が一気にラクになる🧩😊
次の章(最短コマンドセット)に入ると、ここまでの操作がスラスラ一周できるようになるよ🏃♂️💨