
コンテナ開発の「共通の課題」、環境変数管理
コンテナ開発において、環境変数の管理は多くの開発者が直面する共通の課題です。特に、開発、テスト、本番といった複数の環境が存在する場合、手動での管理はミスが誘発し、チーム開発の効率が著しく低下してしまいます。
結論から言うと、direnv
とDocker Compose
を連携させることで、この環境変数管理の悩みを根本から解決し、開発効率を劇的に向上させることができます。
理由は、direnv
はプロジェクトディレクトリに入るだけで必要な環境変数を自動でロードし、ディレクトリから出ると自動でアンロードする機能を提供するからです。これにより、環境ごとの.env
ファイルの切り替えや、手動での環境変数設定の手間が一切不要になります。
例えば、「開発環境と本番環境でデータベースの接続情報が違う」「チームメンバーごとにAPIキーが異なる」「CI/CDで特定の環境変数を上書きしたい」といった具体的な課題も、direnv
とDocker Compose
の連携によってスマートに解決可能です。
本記事では、direnv
とDocker Compose
を連携させる具体的な方法から、開発ワークフローを加速させるベストプラクティスまで、実践的なレシピとしてご紹介します。さあ、あなたもdirenv
でコンテナ開発を次のレベルへと引き上げましょう!
対象読者:
- コンテナ開発における環境変数管理に課題を感じている開発者
direnv
やDocker Compose
を使った効率的な開発環境構築に興味がある開発者- 複数の開発環境(開発、テスト、本番など)での環境変数切り替えを自動化したいと考えている方
動作検証環境
この記事は、以下の環境で検証しています。
- OS : macOS Tahoe Version 26.0
- ハードウェア : MacBook Air 2024 M3 24GB
- Multipass : Multipass version 1.16.1
- Ubuntu : 24.0.4.0.2
- direnv : 2.23.1
- docker ce : 28.5.1
目次:
- コンテナ開発における環境変数管理の課題
- .envファイルとdocker-compose.ymlの関係
- 複数の環境(開発、テスト、本番)での環境変数管理の複雑さ
- direnvでDocker Composeの環境変数をスマートに管理する
- direnvとは?(初心者向け解説)
- プロジェクトルートの.envrcでdotenvを呼び出す
docker-compose.yml
から環境変数を参照する方法- 開発用とテスト用など、環境ごとの切り替え術
- 実践!direnvとDocker Compose連携レシピ
- まとめ:コンテナ開発を加速するdirenvの力
- 免責事項
コンテナ開発における環境変数管理の課題
.envファイルとdocker-compose.ymlの関係
Docker Composeでは、.env
ファイルを使って環境変数を管理するのが一般的です。docker-compose.yml
内で${VAR_NAME}
のように記述することで、.env
ファイルに定義された変数を参照できます。
例えば、以下のような.env
ファイルとdocker-compose.yml
があったとします。
# .env
DATABASE_URL=postgres://user:password@localhost:5432/mydb_dev
API_KEY=your_dev_api_key
# docker-compose.yml
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=${FLASK_ENV}
- DATABASE_URL=${DATABASE_URL}
volumes:
- ./app:/app
この設定により、docker compose up
を実行すると、.env
ファイルで定義されたDATABASE_URL
とAPI_KEY
がweb
サービスに渡されます。
複数の環境(開発、テスト、本番)での環境変数管理の複雑さ
しかし、開発、テスト、本番といった複数の環境が存在する場合、この管理方法は複雑になりがちです。
- 環境ごとの
.env
ファイル:development.env
,test.env
,production.env
のように複数の.env
ファイルを用意し、環境に応じて切り替える必要があります。 - 手動での切り替え:
docker-compose --env-file production.env up
のように、コマンドラインで毎回指定するのは手間がかかりますし、指定忘れのリスクもあります。 - 機密情報の管理: APIキーやデータベースのパスワードといった機密情報を
.env
ファイルに平文で保存することにはセキュリティ上の懸念があります。
これらの課題を解決し、よりスマートに環境変数を管理するためにdirenv
が活躍します。
direnv
を導入することで、以下のメリットが得られます。
- 環境ごとの
.env
ファイルを自動で切り替え:.envrc
ファイル内で環境モード(開発、テストなど)に応じて適切な.env
ファイルを自動的に読み込むように設定できます。例えば、ENV_MODE
という環境変数を設定し、その値に基づいて.env.development
や.env.test
を読み分けることで、プロジェクトディレクトリに入るだけで自動的に環境が切り替わります。 - 手動での切り替え作業が不要に: プロジェクトディレクトリに出入りするだけで、
direnv
が自動的にその環境に必要な環境変数をロード・アンロードするため、開発者は環境変数の存在を意識することなく作業に集中できます。 - 機密情報の安全な管理:
.env
ファイルを.gitignore
に追加することで、APIキーやパスワードなどの機密情報を誤ってバージョン管理システムにコミットしてしまうリスクを防ぎ、セキュリティを向上させます。
direnvでDocker Composeの環境変数をスマートに管理する
direnvとは?(初心者向け解説)
direnv
は、ディレクトリごとに環境変数を自動で切り替えることができるツールです。プロジェクトのルートディレクトリに.envrc
というファイルを作成し、その中に環境変数の設定を記述することで、そのディレクトリに入ったときに自動的に環境変数がロードされ、ディレクトリから出るとアンロードされます。これにより、ターミナルを開き直したり、手動でexport
コマンドを実行したりする手間がなくなります。
プロジェクトごとに専属の秘書がいて、必要な書類(環境変数)を自動で準備してくれるようなものです。
主な機能:
- 自動ロード/アンロード: ディレクトリの出入りに応じて環境変数を自動で設定・解除します。
- 柔軟な設定:
.envrc
ファイルにシェルスクリプトを記述できるため、複雑な環境変数の設定も可能です。 - セキュリティ:
direnv allow
コマンドで明示的に許可しない限り、.envrc
ファイルは実行されません。
この機能により、複数のプロジェクトを並行して開発する際に、環境変数の衝突や設定ミスを防ぎ、開発効率を大幅に向上させることができます。
direnvの概要、macOS/Linux/Windowsでのインストール手順から、.envrcを使ったスマートな活用を、以下の記事で詳細に解説していますので、是非ご覧ください。
プロジェクトルートの.envrcでdotenvを呼び出す
direnv
の.envrc
ファイル内でdotenv
コマンドを使用すると、指定した.env
ファイルを読み込むことができます。これにより、プロジェクトのルートディレクトリに.envrc
を配置し、その中で環境ごとの.env
ファイルを読み分けることが可能になります。
ここで重要なのは、.envrc
と.env
ファイルの役割の違いです。
.envrc
:direnv
が実行するシェルスクリプトであり、環境変数のロード/アンロードのロジックを記述します。環境ごとの.env
ファイルを読み分ける制御を行うのが主な役割です。.env
ファイル: 環境変数のキーと値を定義するファイルです。機密情報や環境固有の設定値を記述します。
つまり、.envrc
が「どの.env
ファイルを読み込むか」を指示し、.env
ファイルが「具体的な環境変数の値」を提供する関係になります。
例えば、開発環境用の.env.development
とテスト環境用の.env.test
がある場合、.envrc
は以下のようになります。
# .envrc
# 環境変数を設定する関数を定義
load_env_file() {
local env_name=$1
if [ -f ".env.${env_name}" ]; then
echo "Loading .env.${env_name}..."
# dotenvコマンドは、指定された.envファイルを読み込み、その中の変数を環境変数として設定します。
# これは、シェルで `source .env` を実行するのと似た働きをしますが、direnvのコンテキストで安全に実行されます。
dotenv ".env.${env_name}"
else
echo "Warning: .env.${env_name} not found."
fi
}
# 環境変数を設定
# デフォルトは開発環境
ENV_MODE=${ENV_MODE:-development}
# 環境モードに応じて.envファイルをロード
load_env_file "${ENV_MODE}"
# direnv allow を実行すると、このスクリプトが実行される
# direnv deny を実行すると、環境変数がアンロードされる
docker-compose.yml
から環境変数を参照する方法
docker-compose.yml
は、direnv
によってロードされた環境変数を自動的に参照します。特別な設定は不要です。
Docker Composeでは、environment
セクションを使ってコンテナに環境変数を渡すことができます。ここで${VAR_NAME}
のように記述することで、ホスト環境(この場合はdirenv
によって設定された環境変数)の値を参照し、それをコンテナ内の環境変数として設定します。
例えば、先ほどのdocker-compose.yml
はそのまま使用できます。
# docker-compose.yml
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=${FLASK_ENV}
- DATABASE_URL=${DATABASE_URL}
volumes:
- ./app:/app
direnv
がDATABASE_URL
とAPI_KEY
をロードしていれば、docker compose up
時にこれらの変数がコンテナに渡されます。
開発用とテスト用など、環境ごとの切り替え術
direnv
と.envrc
を活用することで、環境ごとの切り替えは非常にシンプルになります。

図: direnvとDocker Composeの環境変数の流れ
1. 開発環境 (development
)
プロジェクトディレクトリに入ると、デフォルトで.env.development
がロードされます。
cd your_project_root
# .env.development が自動でロードされる
docker compose up
2. テスト環境 (test
)ENV_MODE
環境変数を設定してからプロジェクトディレクトリに入るか、.envrc
内で一時的に設定を変更します。
# シェルで一時的に設定
export ENV_MODE=test
cd your_project_root
# または、.envrc を編集して ENV_MODE=test にする
docker compose up
これにより、direnv
は.env.test
をロードし、Docker Compose
はテスト環境用の環境変数で起動します。
実践!direnvとDocker Compose連携レシピ
ここでは、簡単なWebアプリケーションを例に、direnv
とDocker Compose
を連携させる具体的な手順を見ていきましょう。
まず、以下のようなファイル構成のサンプルプロジェクトを用意します。
.
├── .env
├── .env.development
├── .env.test
├── .envrc
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
└── app/
└── main.py
.env.development
# .env.development
FLASK_ENV=development
DATABASE_URL=sqlite:///./dev.db
.env.test
# .env.test
FLASK_ENV=testing
DATABASE_URL=sqlite:///./test.db
docker-compose.yml
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=${FLASK_ENV}
- DATABASE_URL=${DATABASE_URL}
volumes:
- ./app:/app
app/main.py
from flask import Flask, jsonify
import os
app = Flask(__name__)
@app.route('/')
def hello():
return jsonify(
message="Hello from Flask!",
flask_env=os.getenv('FLASK_ENV', 'development_default'), # デフォルト値を追加
database_url=os.getenv('DATABASE_URL', 'sqlite:///./default.db') # デフォルト値を追加
)
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
Dockerfile
(プロジェクトルートに配置)
FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
requirements.txt
(プロジェクトルートに配置)
Flask
python-dotenv
まとめ:コンテナ開発を加速するdirenvの力
本記事では、direnv
とDocker Compose
を連携させることで、コンテナ開発における環境変数管理の課題を解決し、開発ワークフローを効率化するレシピをご紹介しました。
direnv
の自動ロード・アンロード機能と、.envrc
による柔軟な環境変数設定を組み合わせることで、あなたはもう手動での環境変数管理に時間を費やす必要はありません。プロジェクトディレクトリに入るだけで、必要な環境が整い、すぐに開発に取り掛かることができます。
このレシピを活用して、あなたのコンテナ開発をさらにスムーズで快適なものにしてください。direnv
は、あなたの開発体験を劇的に向上させる強力なツールとなるでしょう。
さあ、今日からあなたのプロジェクトにdirenv
を導入し、スマートな環境変数管理を始めましょう!
免責事項
- 本記事は、direnvの基本的な使い方と概念を解説するものです。
- 記載されている情報は、執筆時点でのものであり、将来的に変更される可能性があります。
- direnvの利用は自己責任で行ってください。本記事の内容によって生じたいかなる損害についても、著者は一切の責任を負いません。
- 特に
.envrc
ファイルの取り扱いには注意し、信頼できるファイルのみを許可してください。