テスト環境構築時に遭遇したエラー。
PostgreSQLのコンテナを建ててテスト用のデータベースを作成していた。
コンテナをビルドした時にテーブル作成とダミーデータの流し込みをするシェルスクリプトを実行されるようにしていたが実行されていなかった。
ビルドされたコンテナのログを確認するとタイトルのようなログが残っていた。
結論
実行したいスクリプトを docker-entry-point-initdb.d
直下に置いた。
ディレクトリ構成
下記のような構成のディレクトリをマウントさせていた。
test/ ├── init/ │ ├── master-data/ # マスターデータ │ ├── seeding-data/ # シーティング用データ │ ├── test-data/ # テスト専用データ │ └── init.sh # ビルド時に実行されるスクリプト └── docker-compose.yml
docker-compose.yml
の volumes
は下記。
volumes: - ./init:/docker-entrypoint-initdb.d/init - ./init/data:/docker-entrypoint-initdb.d/init/master-data - ./init/seeding-data:/docker-entrypoint-initdb.d/init/seeding-data - ./init/test-data:/docker-entrypoint-initdb.d/init/test-data
docker-entrypoint-init.d
というディレクトリに init
というサブディレクトリを作成してマウント。
init
のさらにサブディレクトリとして master-data
, seeding-data
, test-data
を作った。
docker-entrypoint-init.d
ディレクトリの構成は下記のようになる。
/docker-entrypoint-initdb.d/ └── init/ ├── master-data/ # ホストの ./init/master-data がマウント ├── seeding-data/ # ホストの ./init/seeding-data がマウント ├── test-data/ # ホストの ./init/test-data がマウント └── init.sh # ホストの ./init/init.sh がマウント
これでコンテナをビルドすると init.sh
が走ってデータが登録された状態のテスト用のデータベースを作成できるはずだった。
しかし、実際にはスクリプトが実行されていなかった。
ログチェック
Docker Desktopを開き、作成されたコンテナのログを見てみると、
/usr/local/bin/docker-entrypoint.sh ignoring /docker-entrypoint-initdb.d/init
というログがあった。
docker-entrypoint.sh
はサブディレクトリをスキップする
原因はサブディレクトリ内に初期化用のスクリプトファイルを置いていたこと。
docker-entrypoint.sh
は .sql
や .sh
などのファイルを処理してくれるが、サブディレクトリは処理されずにスキップされてしまう。
そのため、初期化用のスクリプトが実行されるには docker-entrypoint-initdb.d
直下にスクリプトを置かなければならなかった。
したがって、下記のようにマウント先を変更した。
volumes: - ./init:/docker-entrypoint-initdb.d - ./init/data:/docker-entrypoint-initdb.d/master-data - ./init/seeding-data:/docker-entrypoint-initdb.d/seeding-data - ./init/test-data:/docker-entrypoint-initdb.d/test-data
init
を docker-entrypoint-initdb.d
にマウントすることで、 docker-entrypoint-initdb.d
直下に init.sh
が置かれる。
これで docker-entrypoint.sh
が init.sh
を認識してスクリプトが実行されるようになる。
参照ドキュメント
- How to extend this image - dockerhub postgres
- dockerでpostgresのコンテナを建てた際にdocker-entrypoint-initdb.dが実行されない。