この記事では、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-alpineDockerfileには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 bashdocker exec -it <コンテナ名> bashで接続可能です。ここではコンテナ名にpostgresqlを指定します。
docker execについて詳細は別の記事に書きました。こちらを参考にしてください。
次に、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で作成したイメージも削除してくれます。
以上。終わりです。
  
  
  
  


コメント