0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows環境におけるDocker×Alembicの罠:ホスト名解決問題とその解決法

Posted at

はじめに

最近、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なら自動でマッピングされたコンテナ内を向いてくれる

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?