Napa Log

Blog

dockerでPostgresqlを立ち上げたら、初期データが反映されなくて泣いちゃった

サムネイル

ことの背景

今まで個人開発の勤怠管理アプリで、DBにH2databaseを使用していました。
SpringBootでは、特段H2をローカルに必要することなく起動できてしまうので重宝していました。
しかしテストデータを作成する際に、込み入ったSQLを作成しようとすると、どうもh2は情報が少ない。。。(私が公式ドキュメントを読めないだけ)
でもPostgresqlを導入するにも面倒だよなあ、、、
というわけで、使ったこともないDockerにチャレンジしました!
ところが、compose upで、データベースのコンテナが作成されるも、なぜか初期データが投入されない、、、困った。。。
なんなら、起動するときとしないときがある。。。
そんな私の備忘録です。

先に結論

SQL文自体に誤りがあったためであった。そのため、コンテナが作成されても、起動に失敗しているということもあったようです。

環境

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
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   

あれ、起動してない、、、

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

コマンド実施のみで起動済みになった。

ログはちゃんと読みましょう

というお話でした。
実は、3か月振りに使用するリポジトリでしたので、記憶があやふやですが、確かに当時は動いていたはずなので、今回動かないのはdockerの設定ファイルの誤りのせいだ!と決めつけていました。
こういうときって、そういう思い込みでログを読むということをおろそかにしがちですが、やっぱりいつでも一番の近道は「ログを見る」ですね。

参考にさせていただいたサイト

https://qiita.com/asylum/items/17e655d8369c19affbc3