セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン 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ファイル等が呼ばれる気がする。