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
- 最初に読み込む 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
これで
volumes: - ./postgresql/init:/docker-entrypoint-initdb.d
これは 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);
- 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
こうやって docker で動いてログがでて
person=# \dt List of relations Schema | Name | Type | Owner --------+--------+-------+------- public | person | table | kaede
テーブルが作成されて
person=# select * from person; id | name | age ----+------+----- 1 | Taro | 5 2 | Hana | 3 (2 rows)
データが入る。
初期実行 SQL 変更時の注意点
docker-compose up
のあと、初期実行 SQL を変更したら
docker-compose down -v する必要が有る。
Docker コンテナを止めても Docker 内部の Volumes に DB は残るので
SQL ファイルを書き直しても DB は更新されない。
なので Volumes を破棄する必要が有る。
docker-compose kill containerName で
毎回コンテナごと破棄するのも有り。
だが、なかのボリュームだけ破棄するのがベターなので
--volumes でボリュームを落とす。
Top comments (0)