Halcyon Days

IT × 移住 × ファイナンス

MENU

/usr/local/bin/docker-entrypoint.sh ignoring /docker-entrypoint-initdb.d/* が出た時の対処法

テスト環境構築時に遭遇したエラー。

PostgreSQLのコンテナを建ててテスト用のデータベースを作成していた。

コンテナをビルドした時にテーブル作成とダミーデータの流し込みをするシェルスクリプトを実行されるようにしていたが実行されていなかった。

ビルドされたコンテナのログを確認するとタイトルのようなログが残っていた。

結論

実行したいスクリプトdocker-entry-point-initdb.d 直下に置いた。

ディレクトリ構成

下記のような構成のディレクトリをマウントさせていた。

test/
├── init/
│   ├── master-data/    # マスターデータ
│   ├── seeding-data/   # シーティング用データ
│   ├── test-data/      # テスト専用データ
│   └── init.sh         # ビルド時に実行されるスクリプト
└── docker-compose.yml

docker-compose.ymlvolumes は下記。

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

initdocker-entrypoint-initdb.d にマウントすることで、 docker-entrypoint-initdb.d 直下に init.sh が置かれる。

これで docker-entrypoint.shinit.sh を認識してスクリプトが実行されるようになる。

参照ドキュメント