事象
/docker-entrypoint-initdb.d
にSQLファイルを配置した後、docker-compose up -d
してDockerコンテナを作成・起動した。
しかし、DBサーバを確認してもテーブル/データが作成されていない。
環境
- ローカルPC内でdocker-compose.yamlを用いてDockerコンテナ起動
- DB:PostgreSQL
- docker-compose.yaml内で
volumes:
オプションを用いて/docker-entrypoint-initdb.d
をマウントし、起動時に実行してほしいDDLを配備してある。
解決法:DBサーバ起動時のログを確認する
下記コマンドで、DB起動時のログが出力される。SQL実行時のログも確認できる。
docker-compose logs <サービス名(例:db)>
サービス名とは、docker-compose.yaml
のservices:
の次階層に指定している名前のことを指す。
ログでエラーが吐かれている箇所を確認したら、エラー内容に合わせてデータを修正し、再度コンテナを作成すればOK。
psql:/docker-entrypoint-initdb.d/ddl.sql:136: ERROR: relation "table_name" does not exist
自分の場合よくあるエラー原因は、create table
やcreate view
の実行順序の関係だったり、create table
で作成するテーブルとinsert
するデータのDDLの間でカラムの不整合が生じている事だったりする。
起動時に実行してほしいSQLファイルが複数ファイル存在する場合は、外部参照の都合を考えつつ、SQLファイルのファイル名先頭を実行してほしい順番でナンバリングするようにしている。
おわりに
ネットで、「初期SQLは文法エラーがあった場合でもログ等に出力されないからDDLとにらめっこして原因を探すしかない」みたいな内容を見かけたので、そう思っている方を救うつもりで書きました。