Skip to main content

第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 LTSv25が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-fileKEY=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_MODEdev / prod など🎭
  • LOG_LEVELdebug / 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.exampleconfig.ts から自動生成するなら、どういうルールが良い?」🧠
  • APP_MODE によってログの出し分け設計、初心者向けに最小で提案して」🪵✨

9) ミニ課題🎯(5〜10分)

課題A:モード切り替え🎭

  1. env.devenv.prod を作る
  2. APP_MODELOG_LEVEL を変える
  3. docker run --env-file ... で起動して、Nodeで表示内容を変える😆

例:

  • dev のときは「デバッグ情報も出す」🪵
  • prod のときは「最小だけ」🧼

まとめ🎉

  • 環境変数は「設定のつまみ」🎚️
  • Dockerは -e / --env-file で簡単に渡せる📦✨ (Docker Documentation)
  • “渡したつもり” を防ぐために、docker exec ... env で中を確認できると強い👀💪
  • Todo APIでは config.ts に集約すると設計が一気にラクになる🧩😊

次の章(最短コマンドセット)に入ると、ここまでの操作がスラスラ一周できるようになるよ🏃‍♂️💨