DEV Community

kaede
kaede

Posted on • Edited on

SQL 基礎 Part 04 -- docker-compose で立てたコンテナで DB サーバー立ち上げ時にテーブルを作る

why

前回の記事で、DB を Docker Compose で立ち上げて、ローカルから接続することができた。

しかし、それでは Database を作っただけで、中身のテーブルがない

なのでそれを作る処理をする


docker-compose.yml で PSQL DB と USER を作って SQL を読み込めるようにする

Docker Compose のファイル

version: '3.2'                                                                                                                                                

services:
  #
  # PostgreSQL
  #
  person-db:
    image: postgres:14-bullseye
    container_name: person-db
    ports:
      - 5444:5432
    volumes:
      - ./postgresql/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: kaede
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: person
      POSTGRES_INIT_DB_ARGS: --encoding=UTF-8
    restart: always

Enter fullscreen mode Exit fullscreen mode
  • 最初に読み込む SQL ファイルの場所を指定
  • ルートユーザーとルートユーザーのパスワードを作成
  • DB を作成

ここまで動く。

docker-compose up

person-db    | server started
person-db    | CREATE DATABASE
person-db    | 
person-db    | 
person-db    | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/00-init.sql
Enter fullscreen mode Exit fullscreen mode

これで

    volumes:
      - ./postgresql/init:/docker-entrypoint-initdb.d
Enter fullscreen mode Exit fullscreen mode

これは volumes で
ローカルの ./postgresql/init/ の中身を
Docker の /docker-entrypoint-initdb.d が実行されるときの読み込み先に指定している。

これによって ./postgresql/init/ の .sql ファイルが
Docker Compose up 時にファイル名順に実行されるようになる。


00-init.sql で USER に権限をつけて、person DB に行って、person テーブルを作ってレコードを追加する。

SQL で CREATE DB とか CREATE USER は書く必要はない。
docker-compose.yml の environment の
POSTGRES_{ DB, USER, PASS } で作成できるから。

ルートユーザー以外も作りたい場合は必要。

GRANT ALL PRIVILEGES ON DATABASE person TO kaede;

\c person

create table person(
  id int not null,
  name text,
  age int 
);
insert into person values (1,'Taro', 5); 
insert into person values (2,'Hana', 3); 
Enter fullscreen mode Exit fullscreen mode
  • kaede というユーザーに personDB の全権を渡す
  • person DB に移動
  • テーブル作成
  • テーブルの初期データ挿入 (SQL では string を "" で書くとエラーになるので注意)

こうして、docker compose 起動後に読み込まれる SQL にこれを書くことで

person-db    | /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/00-init.sql
person-db    | GRANT
person-db    | You are now connected to database "person" as user "kaede".
person-db    | CREATE TABLE
person-db    | INSERT 0 1
person-db    | INSERT 0 1
Enter fullscreen mode Exit fullscreen mode

こうやって docker で動いてログがでて

person=# \dt
        List of relations
 Schema |  Name  | Type  | Owner 
--------+--------+-------+-------
 public | person | table | kaede
Enter fullscreen mode Exit fullscreen mode

テーブルが作成されて

person=# select * from person;
 id | name | age 
----+------+-----
  1 | Taro |   5
  2 | Hana |   3
(2 rows)
Enter fullscreen mode Exit fullscreen mode

データが入る。


初期実行 SQL 変更時の注意点

docker-compose up
のあと、初期実行 SQL を変更したら
docker-compose down -v する必要が有る。

Docker コンテナを止めても Docker 内部の Volumes に DB は残るので
SQL ファイルを書き直しても DB は更新されない。
なので Volumes を破棄する必要が有る。

docker-compose kill containerName で
毎回コンテナごと破棄するのも有り。

だが、なかのボリュームだけ破棄するのがベターなので
--volumes でボリュームを落とす。

Top comments (0)