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
の書式について詳しくは以下:
おわり
該当ケースがあまりないけど記録として残しておきたい。
以上です。