ことの背景
今まで個人開発の勤怠管理アプリで、DBにH2databaseを使用していた。
SpringBootでは、特段H2をローカルに必要することなく起動できてしまうので重宝していた。
しかしテストデータを作成する際に、込み入ったSQLを作成しようとすると、どうもh2は情報が少ない。。。(私が公式ドキュメントを読めないだけ)
でもPostgresqlを導入するにも面倒だよなあ、、、
というわけで、使ったこともないDockerにチャレンジした!
ところが、compose upで、データベースせずできるも、なぜか初期データが投入されない、、、困った。。。
そんな私の備忘録です。
先に結論
SQLが間違ってた。Dockerの設定は何も間違っていなかった。
環境
dynabook G83/M
windows11
wsl:Ubuntu 22.04.3 LTS
事象
それぞれファイルを準備
├── .env
├── docker-compose.yml
├── initdb
│ ├── init.sql
version: "3"
services:
appdb:
image: postgres:10
container_name: "appdb"
environment:
- POSTGRES_USER
- POSTGRES_PASSWORD
- POSTGRES_DB
ports:
- "15432:5432"
volumes:
- database:/var/lib/postgresql/data
- ./initdb:/docker-entrypoint-initdb.d
volumes:
database:
driver: local
POSTGRES_USER=feeuser
POSTGRES_PASSWORD=feeuser
POSTGRES_DB=feeuser
init.sqlファイルは、2000行に及ぶハードコーディングですので省略です。
CREATE TABLE if not exists fee(
id integer NOT NULL,
fee_seq integer NOT null,
round_trip character varying(5),
total_fee integer,
use_date date not null,
PRIMARY KEY(id, fee_seq, use_date)
);
insert ,,,,,,
それでは、dockerで立ち上げていきます。
docker-compose up -d
[+] Running 15/15
✔ appdb 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 15.6s
✔ bff3e048017e Pull complete 3.9s
✔ e3e180bf7c2b Pull complete 6.9s
✔ 62eff3cc0cff Pull complete 0.7s
✔ 3d90a128d4ff Pull complete 2.1s
✔ ba4ce0c5ab29 Pull complete 4.1s
✔ a8f4b87076a9 Pull complete 3.4s
✔ 4b437d281a7e Pull complete 4.1s
✔ f1841d9dcb17 Pull complete 4.6s
✔ b05674a6c170 Pull complete 9.3s
✔ d59b5be914c6 Pull complete 4.8s
✔ 901d5d9b0beb Pull complete 5.5s
✔ 4a7aa9546b2c Pull complete 5.6s
✔ 0a0d389be22f Pull complete 6.2s
✔ fb7bd7cfbcd2 Pull complete 6.3s
[+] Running 3/3
✔ Network feemanage_default Created 0.1s
✔ Volume "feemanage_database" Created 0.0s
✔ Container appdb Started 0.6s
あれ、起動してない、、、
dockerが理解できてないので、きちんと理解しよう!と
2時間格闘の末、わからず、、、、
明日の自分に託すことに、、、
原因
docker云々ではなく、SQLの文法が間違っていた。
dockerの拡張機能より、ログを確認。(こんな機能あるんだ、ということに気づいていませんでした)
ログが出てくるので、文末を抜粋
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
2023-12-29 05:45:00.565 UTC [83] ERROR: null value in column "fee_seq" violates not-null constraint
2023-12-29 05:45:00.565 UTC [83] DETAIL: Failing row contains (1, null, piyo, pipupu, PPU, PPA).
psql:/docker-entrypoint-initdb.d/init.sql:65: ERROR: null value in column "fee_seq" violates not-null constraint
DETAIL: Failing row contains (1, null, piyo, pipupu, PPU, PPA).
2023-12-29 05:45:00.565 UTC [83] STATEMENT: insert into
worker (
id,
first_name,
last_name,
dept,
team
)
VALUES
(
'1',
'piyo',
'pipupu',
'PPU',
'PPA'
);
* ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。
fee_seqっていうカラムあるはずなんだけどどうしたの?と聞かれているようでした。
解決策
sqlファイルをきちんとしたものにするとOKでした。
docker-compose downでコンテナ停止し、imageとvolumeを念のため削除。
そして、docker-compose up -dを実施。
[+] Running 15/15
✔ appdb 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 16.1s
✔ bff3e048017e Pull complete 4.9s
✔ e3e180bf7c2b Pull complete 1.8s
✔ 62eff3cc0cff Pull complete 0.7s
✔ 3d90a128d4ff Pull complete 1.9s
✔ ba4ce0c5ab29 Pull complete 4.3s
✔ a8f4b87076a9 Pull complete 3.1s
✔ 4b437d281a7e Pull complete 5.0s
✔ f1841d9dcb17 Pull complete 9.5s
✔ b05674a6c170 Pull complete 9.9s
✔ d59b5be914c6 Pull complete 5.7s
✔ 901d5d9b0beb Pull complete 5.8s
✔ 4a7aa9546b2c Pull complete 6.5s
✔ 0a0d389be22f Pull complete 8.0s
✔ fb7bd7cfbcd2 Pull complete 7.4s
[+] Running 3/3
✔ Network feemanage_default Created 0.1s
✔ Volume "feemanage_database" Created 0.0s
✔ Container appdb Started
コマンド実施のみで起動済みになった。
ログはちゃんと読みましょう
参考にさせていただいたサイト