エラー経緯、内容
アプリのDBとして、docker上でPostgreSQLを動かすようにdocker-compose.yml
を以下内容で作成。
version: '3.1'
services:
database:
image: postgres
restart: always
ports:
- 5432:5432
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: root
その後migration
を実行すると
FATAL: role "root" does not exist
というエラーが発生。
解決策
結論
root
のロールを作成し、必要な権限を与える
具体的にやったこと
psql
コマンドでDBの起動状況を確認します。
psql -l
Owner
欄にroot
がないため、そもそもロールにrootの登録がなし。
したがって、まずはrootのロールを作成します(docker-compose
の設定に合わせてpassword
も設定)。
postgres=# CREATE ROLE root WITH LOGIN PASSWORD 'root';
その後、psqlコマンドで何でも良いのでDBに接続し、ロールの情報を表示させます。
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create DB | {}
root | | {}
tomokazu | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
これを見ると、Role name
がtomokazu
である場合にのみ、Create role
の権限が付いているため、tomokazu
のロールで作成されたDBにどれでもいいので接続し、rootのロールを作成します。
psql -U tomokazu -d postgres
接続後、ALTER ROLE
コマンドで権限を付与します(CREATE ROLE
時に権限も同時に付与できそうなので、それでも良いと思います)。
ALTER ROLE root SUPERUSER CREATEDB;
もう一度\du
でロールの設定一覧を確認すると、
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create DB | {}
root | Superuser, Create DB | {}
tomokazu | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
ということで、めでたくロールroot
の作成と権限付与が完了。
もちろん、問題なくdocker上でPostgreSQLを使えるようになりました!
覚えておくべきこと + 疑問点
覚えておくべきこと
あまりPostgreSQLを使っていないせいか、まず何のコマンドで動作状況なり、DB接続等を行うのかわからなかったため、以下コマンドはざっくり覚えておこうと思います。
psql -h [ホスト名] -p [ポート番号] -U [ロール名] -d [DB名]
# つまり具体的にはこんな感じ
psql -h localhost -p 5432 -U postgres -d postgres
疑問点
ローカル側のpsqlコマンドにてrootのロールを作成し、必要な権限を設定したのですが、なぜdocker上
のpsql操作ではなく、ローカル側
で良かったのか?
docker設定の細かな内容が理解ができていないのか、
はたまたPostgreSQLの動きを理解できていないのか、引き続きその理由を調査する必要があるなあと感じました。