セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

【Docker】docker-entrypoint-initdb.d内ファイルっていつ呼ばれるのよ

//

タイトル通り

初歩的な内容です。いつ呼ばれるというのは、"タイミング"の話ではなく、"初回起動時"とかそんな感じです。

docker-compose.yml

大体こんな感じの設定でビルドしてます。

#docker-compose.yml
version: '3'
services:
...
   db:
    image: mysql:8.0
    container_name: mysql
    command: mysqld --sql_mode=""
    environment:
      - TZ=Asia/Tokyo
    volumes:
      - "./sql:/docker-entrypoint-initdb.d"
      - "./mysql_data:/var/lib/mysql"


たどる

mysql8.0ではdocker-entrypoint.sh内の次の行にてファイルが呼ばれている。

# docker-entrypoint.sh
for f in /docker-entrypoint-initdb.d/*; do
    process_init_file "$f" "${mysql[@]}"
done

# https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/8.0/docker-entrypoint.sh

mysql/docker-entrypoint.sh at 696fc899126ae00771b5d87bdadae836e704ae7d · docker-library/mysql · GitHub
そしてこのコードは次の条件から分岐している。

# docker-entrypoint.sh
if [ ! -d "$DATADIR/mysql" ]; then
....

# https://github.com/docker-library/mysql/blob/696fc899126ae00771b5d87bdadae836e704ae7d/8.0/docker-entrypoint.sh#L100


$DATADIRはとりあえずdatadirの値が来ているようで、設定上/var/lib/mysqlに対応していた。 https://github.com/docker-library/mysql/blob/fc3e856313423dc2d6a8d74cfd6b678582090fc7/8.0/config/my.cnf#L25

ので、上のdocker-compose.ymlでは/var/lib/mysqlmysql_dataディレクトリをマウントしているため、今回であれば初回起動時もしくはmysql_dataディレクトリが空の時、docker-entrypoint-initdb.d内の.sqlファイル等が呼ばれる気がする。