psycopg2.OperationalError: FATAL: password authentication failed for user <username>の対処。
特にVSCodeのリモートコンテナ(Python3 & PostgreSQL)を使っている場合。
状況
Djangoで使っているローカルのPostgreSQLへの接続をVSCodeのリモートコンテナ上のPostgreSQLへの接続に切り替えようとしたところ、psycopg2.OperationalError: FATAL: password authentication failed for user <username>が発生した。
エラーメッセージの通り、パスワードの設定情報が間違っている。デフォルトのPython3 & PostgreSQLのリモートコンテナでは、./.devcontainer/docker-compose.ymlのservices:db:environmentでDB名や認証情報が設定されている。その内容は次のような感じ(抜粋):
# ./.devcontainer/docker-compose.ymlから抜粋
db:
image: postgres:latest
# ...
environment:
POSTGRES_USER: postgres
POSTGRES_DB: postgres
POSTGRES_PASSWORD: postgres
これに対して本来設定済みの情報があるのでそれを使っての接続ができない状態になっていた。
このPOSTGRES_*を書き換えてコンテナをリビルドすれば解決...できない。同じエラーが出る。
解決
書き換えても解決できない理由は単純で、services:dbが使っているvolumeが残っているのでリビルドしても最初のビルドで設定された認証情報が残ってしまうからだ。
ローカルのpostgresのデータを移す必要がない場合、ただのリビルドではボリュームは削除されないので、ボリュームを削除してリビルドすれば正しい認証情報で作られるのでエラーがでなくなり解決できる。ボリュームの削除は、Docker Desktopのダッシュボードなどからできる。
ローカルのpostgresのデータを移す場合、ローカルのデータをリモートコンテナのボリュームにコピーすればいいはず(未確認)。
もし以前使っていたポート番号がデフォルトの5432でないなら./.devcontainer/docker-compose.ymlに追記する。当該リモートコンテナの外からのアクセスを許可したいときは、./.devcontainer/devcontainer.jsonで"forwardPorts": [5000, 5432],などを指定する必要がある。devcontainer.jsonの書式について詳しくは以下:
おわり
該当ケースがあまりないけど記録として残しておきたい。
以上です。


