【Docker】PostgreSQLの起動時に初期データをセットアップ

docker
スポンサーリンク

この記事では、dockerでPostgreSQLの環境を構築する際に、DBやテーブル、データをセットアップする方法を記載します。

docker-composeを使用してDB起動時に初期設定ファイルを読み込むと、ファイルに記載した設定通りにセットアップが可能です。

DockerでPostgreSQL起動時に初期セットアップする手順

1. 全体のフォルダ構成

.
├── docker-compose.yml
└── postgresql
    ├── Dockerfile
    └── init
        └── init.sql
  • docker-compose.yml: docker-composeで複数コンテナを起動するファイル
  • Dockerfile: PostgreSQLのイメージを作成するファイル
  • init.sql: DBの初期セットアップを行うファイル

2. docker-compose.ymlの作成

version: '3'

services:
  postgresql:
    container_name: postgresql
    build: ./postgresql
    ports:
      - 5432:5432
    volumes:
      - ./postgresql/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    restart: always
  • サービス名はpostgresql
  • container_name: コンテナ名
  • build: Dockerfileのあるディレクトリを指定
  • ports: ポートを公開(ホスト:コンテナ)
  • volumes: ホスト側のパスをコンテナにマウント(ホスト:コンテナ)
  • environment: 環境変数を指定(POSTGRES_USERは省略するとpostgresになる)
  • restart: always指定でコンテナが停止しても再起動

Dockerfileでビルドせずにimageを指定する場合は、buildの代わりにimage: postgres:バージョンを指定します。

DBの初期セットアップを行うときは、volumesで/docker-entrypoint-initdb.dに対して.sql、.sql.gzまたは.shファイルをマウントします。ここでは、./postgresql/initのフォルダ内にinit.sqlのファイルを配置して、それをマウントするようにしています。

3. Dockerfileの作成

FROM postgres:14.0-alpine

DockerfileにはFROM postgresql:バージョンだけでOKです。
docker-compose.ymlにimage: postgresql:バージョンを指定する場合は、Dockerfileは必要ありません。

4. DBの初期セットアップ用ファイルを作成

--ユーザーの作成
CREATE USER docker;
--DBの作成
CREATE DATABASE docker;
--ユーザーにDBの権限をまとめて付与
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
--ユーザーを切り替え
\c docker
--テーブルを作成
CREATE TABLE book (
  id integer, 
  name varchar(30)
);
--テーブルにデータを挿入
INSERT INTO book VALUES (1,'The Very Hungry Caterpillar');

docker-compose.ymlのvolumesでマウントするinit.sqlファイルを作成します。

ここではdockerというユーザーとDBを作成して、そこにテーブルを作成しました。

ユーザーの切り替えを行わない場合、POSTGRES_USERに指定した値のDBが作成され、そのDBにテーブルが作成されます。少し注意が必要です。

5. docker-compose upで起動してDBを確認

docker-compose up -d

-dオプションをつけるとバックグラウンドで実行されます。

ローカルからdockerで立ち上げたコンテナに接続する場合、docker execコマンドを使用します。

docker exec -it postgresql bash

docker exec -it <コンテナ名> bashで接続可能です。ここではコンテナ名にpostgresqlを指定します。

次に、PostgreSQLに接続してみます。POSTGRES_USERで指定したuserで接続します。

bash-5.1# psql -U user
psql (14.0)
Type "help" for help.

user=# 

無事、psql -U userで接続できました。
データベース一覧を確認して、userとdockerがあることを確認します。

user=# \l
                             List of databases
   Name    | Owner | Encoding |  Collate   |   Ctype    | Access privileges 
-----------+-------+----------+------------+------------+-------------------
 docker    | user  | UTF8     | en_US.utf8 | en_US.utf8 | =Tc/user         +
           |       |          |            |            | user=CTc/user    +
           |       |          |            |            | docker=CTc/user
 postgres  | user  | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | user  | UTF8     | en_US.utf8 | en_US.utf8 | =c/user          +
           |       |          |            |            | user=CTc/user
 template1 | user  | UTF8     | en_US.utf8 | en_US.utf8 | =c/user          +
           |       |          |            |            | user=CTc/user
 user      | user  | UTF8     | en_US.utf8 | en_US.utf8 | 
(5 rows)

userにはテーブルを作成していないので、何もありません。

user=# \d
Did not find any relations.

dockerに切り替えて作成したテーブルがあることを確認します。

user=# \c docker
You are now connected to database "docker" as user "user".
docker=# \d
       List of relations
 Schema | Name | Type  | Owner 
--------+------+-------+-------
 public | book | table | user
(1 row)

テーブルのデータもチェックします。

docker=# select * from book;
 id |            name             
----+-----------------------------
  1 | The Very Hungry Caterpillar
(1 row)

問題なく初期セットアップができているようです。

6. docker-compose downでコンテナを停止

docker-compose down --rmi local

–rmi localのオプションをつけると、Dockerfileで作成したイメージも削除してくれます。

以上。終わりです。

コメント

タイトルとURLをコピーしました