はじめに
Dockerを使ってアプリ開発をしようと思い、手探りで学んでいる中で遭遇したエラーの解決方法を備忘録として残します。
開発環境
- Java 17
- Spring Boot 3系
- PostgreSQL
- Docker
発生したエラー
FATAL: password authentication failed for user "postgres"
Docker公式ドキュメントを見ると、同様の事例が紹介されていました。
コンテナを異なるパスワードで一度実行し、その後別のパスワードで再起動した場合、既存のデータベースは既に初期化されているため更新されません。古いボリュームを削除するか、別のボリュームを使用してください。
つまり:
- 初回起動時にDBが初期化される
- その後
POSTGRES_PASSWORDを変更しても反映されない - なぜならデータはvolumeに保持されているから
そのため、古いvolumeを削除しました。
$ docker volume rm <your-volume-name>
しかし、再度コンテナを立ち上げても同じエラーが発生しました。
自分が直面した原因は ポート競合 でした。
ローカル環境(Mac)で既にPostgreSQLが 5432 番ポートを使用していました。
Spring Bootの接続設定は以下のようになっていました。
spring.datasource.url=jdbc:postgresql://localhost:5432/POSTGRES_DB
たびたび、ローカルのポート番号とDockerのポート番号が等しい時があるため、それを何も深掘りせず参考にしたためエラーが起こりました。
この場合、localhost が指しているのは
Dockerコンテナ内のPostgreSQLではなくMac上で動いているPostgreSQL
つまり、SpringはDockerではなくローカルDBに接続していたのです。
そのため、パスワード不一致で認証エラーが発生していました。
解決方法
docker-compose.yml のポートを変更しました。
ports:
- "55432:5432"
これは以下の意味になります。
Macの55432 → Docker内の5432
そしてSpring側も変更。
spring.datasource.url=jdbc:postgresql://localhost:55432/POSTGRES_DB
これでDocker内のPostgreSQLに正しく接続できるようになりました。