7.

.env ファイル完全ガイド — 環境変数・dotenv・12-factor app・シークレット管理

編集
この記事の要点
  • .env ファイルは環境変数を key=value 形式で外部化する設定ファイル
  • 12-factor app の「III. Config」原則に基づき、コードと設定(特にシークレット)を分離する
  • API キー・DB パスワード・JWT 秘密鍵などの機密情報置き場として事実標準
  • .gitignore に必ず追加。代わりに .env.example をコミットしてキー一覧だけ共有する
  • dotenv ライブラリが Node.js・Python・PHP・Ruby・Go など全主要言語にある
  • KEY="$OTHER" で変数展開、# でコメント、シェルとは似て非なる文法に注意

概要

.env ファイルは、アプリケーションが起動時に読み込む環境変数を KEY=value 形式で外部ファイルにまとめたものです。拡張子という形ではなく ファイル名そのものが .env という UNIX 系の隠しファイル形式で、ドット 1 つで始まるためエクスプローラのデフォルトでは見えないことが多いです。

この仕組みは The Twelve-Factor App(Heroku が提唱した SaaS 構築方法論)の「III. Config — 設定を環境変数に格納する」原則を実装するもので、Ruby on Rails コミュニティ発の dotenv gem(bkeepers/dotenv、2012 年〜)から普及しました。現在は Node.js・Python・PHP(Laravel が標準採用)・Go・Rust などほぼ全言語に dotenv 系ライブラリがあり、API キー・DB 接続情報・OAuth クライアントシークレットなど機密情報を保管する事実標準となっています。

構文・データモデル

1 行 1 変数、KEY=value 形式。値はクォート省略可ですが、スペースや特殊文字を含むときはクォートします。

# コメントは # で始める

APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:abc123...

# 値にスペースや記号があるときはクォート
APP_NAME="My Application"
DB_PASSWORD='p@$$word!'

# 変数展開(dotenv によっては対応しない)
DB_HOST=localhost
DATABASE_URL="postgres://user:pass@${DB_HOST}:5432/mydb"

# 空行と末尾コメントは無視される
MAIL_FROM=admin@example.com   # 送信元アドレス

Laravel の .env も同じ形式で、config/*.php から env('APP_KEY') で参照されます。Node.js では require('dotenv').config()process.env.APP_KEY に流し込まれます。

主な用途

  • 機密情報の外部化: API キー、DB パスワード、JWT 秘密鍵、OAuth クライアントシークレット
  • 環境ごとの設定切り替え: .env.development / .env.production / .env.test など環境別ファイル
  • Docker Compose 連携: docker-compose.yml が同階層の .env を自動読み込み
  • Vite / Next.js のビルド時定数: VITE_API_URLNEXT_PUBLIC_* といったプレフィックス付き変数
  • CI/CD のシークレット注入: GitHub Actions / GitLab CI が .env を出力してビルドに渡すパターン

関連形式との比較

項目.envJSONYAMLシェル変数
形式key=value のみ木構造木構造key=value
ネスト不可(フラット)不可
コメント可(#不可
用途シークレット・設定API・データCI・IaCシェル環境
git 管理原則しないするする該当なし
標準化仕様統一なし(実装依存)RFC 8259YAML 1.2POSIX

編集・パーサ・ツール

  • 各言語の dotenv ライブラリ:
    • Node.js: dotenv(最も普及)、dotenv-flowdotenvx
    • Python: python-dotenv
    • PHP: vlucas/phpdotenv(Laravel が利用)
    • Ruby: dotenv gem
    • Go: joho/godotenv
    • Rust: dotenvy
  • direnv: ディレクトリ移動時に .envrc を自動 source する開発者向けツール
  • doppler / 1Password CLI / AWS Secrets Manager / HashiCorp Vault: 本番では .env をやめて専用シークレット管理に移行することも多い
  • direnv-vscode、EnvFile プラグイン: IDE での .env 読み込み支援

注意点・落とし穴

  • 絶対に git にコミットしない: .gitignore.env を必ず追加。誤コミットしたら git history からも除去し、漏れたシークレットは 全てローテーションする
  • 共有用に .env.example を用意: キー名と説明だけ書いた雛形を git 管理する
  • シェルの構文ではない: .env はシェルで source するためのものではない。export プレフィックスは不要(dotenv 系は無視するが、シェルは違う解釈をする)
  • クォートとエスケープ: ダブルクォート内では \n を改行に展開するライブラリがある一方、シングルクォートでは展開しない。実装ごとに差があるので注意
  • 本番では使わない選択肢も: 本番環境ではコンテナの環境変数や Secret Manager で渡し、.env はローカル開発専用とする運用が推奨される(12-factor 的)
  • 変数展開の差異: ${OTHER} 形式の展開対応はライブラリ依存。Laravel の .env は対応、素の dotenv-node は古いバージョンでは未対応だった
  • フロントエンドに渡す変数は公開される: Vite の VITE_*、Next.js の NEXT_PUBLIC_* はビルド時にバンドルへ埋め込まれ、ブラウザから読める。シークレットを入れてはいけない

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTML(.html / .htm)
  2. CSS(.css)
  3. JSON(.json)
  4. XML(.xml)
  5. YAML(.yaml / .yml)
  6. TOML(.toml)
  7. env(.env)
  8. INI(.ini)
  9. properties(.properties)
  10. conf(.conf)

最近更新/作成されたページ