LoginSignup
13
12

More than 3 years have passed since last update.

DockerのDBとしてPostgreSQLを使用した際に躓いたところ

Last updated at Posted at 2020-06-01

エラー経緯、内容

アプリのDBとして、docker上でPostgreSQLを動かすようにdocker-compose.ymlを以下内容で作成。

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の起動状況を確認します。

terminal
psql -l

Owner欄にrootがないため、そもそもロールにrootの登録がなし。

したがって、まずはrootのロールを作成します(docker-composeの設定に合わせてpasswordも設定)。

PostgreSQL
postgres=# CREATE ROLE root WITH LOGIN PASSWORD 'root';

その後、psqlコマンドで何でも良いのでDBに接続し、ロールの情報を表示させます。

PostgreSQL
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 nametomokazuである場合にのみ、Create roleの権限が付いているため、tomokazuのロールで作成されたDBにどれでもいいので接続し、rootのロールを作成します。

terminal
psql -U tomokazu -d postgres

接続後、ALTER ROLEコマンドで権限を付与します(CREATE ROLE時に権限も同時に付与できそうなので、それでも良いと思います)。

PostgreSQL
ALTER ROLE root SUPERUSER CREATEDB;

もう一度\duでロールの設定一覧を確認すると、

PostgreSQL
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接続等を行うのかわからなかったため、以下コマンドはざっくり覚えておこうと思います。

terminal
psql -h [ホスト名] -p [ポート番号] -U [ロール名] -d [DB名]

# つまり具体的にはこんな感じ
psql -h localhost -p 5432 -U postgres -d postgres

疑問点

ローカル側のpsqlコマンドにてrootのロールを作成し、必要な権限を設定したのですが、なぜdocker上のpsql操作ではなく、ローカル側で良かったのか?
docker設定の細かな内容が理解ができていないのか、
はたまたPostgreSQLの動きを理解できていないのか、引き続きその理由を調査する必要があるなあと感じました。

13
12
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
13
12