はじめに
最近、Windowsで動かしているDockerコンテナ内のPostgreSQLデータベースに対してAlembicマイグレーションを実行しようとしたところ、予想外の問題に遭遇しました。この記事では、その問題の原因と解決策をメモします
問題の概要
PostgreSQLデータベースをDockerコンテナで実行し、Alembicを使ってマイグレーションを適用しようとしたところ、以下のようなエラーが発生しました
sqlalchemy.exc.OperationalError: (psycopg.OperationalError) [Errno 11001] getaddrinfo failed
このエラーの根本原因は、名前空間の衝突でした。
Docker Composeで定義したサービス名(この場合は「db」)は、Dockerネットワーク内部では有効なホスト名ですが、ホストマシン(Windows)からは解決できません。
wsl環境なら、ここでalembic.iniの接続先をlocalhostからdbへ向ければマイグレーションを実行すれば適用できるはずでした。
症状の詳細
1.docker-compose.ymlでデータベースサービスを「db」として定義
2.alembic.iniで接続先をpostgresql+psycopg://postgres:admin@db:5432/mydbと設定
ホストマシンからalembic upgrade headを実行
3.「getaddrinfo failed」エラーでマイグレーションが失敗
解決策
結論から言えば、Dockerコンテナ内からマイグレーションを実行することで適用できました。
docker-compose exec backend bash -c "cd /app && alembic upgrade head"
このコマンドで、バックエンドコンテナ内でマイグレーションを実行したところうまくいきました。コンテナは同じDockerネットワーク内にあるため、「db」というホスト名を正しく解決できます。
おそらく、名前空間の衝突はlocalhost上に構築された同名のDBが存在していことが原因だったと思います。
教訓
環境の違いを意識する:Docker内とホストマシンでは名前解決の仕組みが異なる
単一の構成設定のリスク:複数の環境で動作させるためには、環境ごとの設定が必要
Windows環境でDockerを使った開発をするな:wslなら自動でマッピングされたコンテナ内を向いてくれる