【Docker】MySQL(MariaDB)コンテナ起動時に初期データを投入する

構成


project/
|-- sql/
|   |-- init.sql
`-- docker-compose.yml

docker-compose.yml


version : '3'
services:
  db:
    image: mysql:latest
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: example
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: Asia/Tokyo
    volumes:
      - ./sql:/docker-entrypoint-initdb.d

コンテナ初回起動時に/docker-entrypoint-initdb.dにある.sh.sql.sql.gz拡張子のファイルがアルファベット順に実行されるので./sql/docker-entrypoint-initdb.dにマウントします。
それにより./sql/init.sqlが実行されることになります。

init.sql


DROP TABLE IF EXISTS `users`;
create table `users` (
    `user_id`         BIGINT(20) AUTO_INCREMENT,
    `user_name`       VARCHAR(36) NOT NULL,
    `user_created_at` DATETIME DEFAULT '0000-00-00 00:00:00',
    UNIQUE KEY uq_keys(user_name),
    PRIMARY KEY (`user_id`)
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

INSERT INTO users (user_name, user_created_at) VALUES ('Michael', now());

起動


docker-compose up -d

データ確認

コンテナIDの確認

docker ps                             
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS
32b99b6a0b1a   mysql:latest   "docker-entrypoint.s…"   5 minutes ago   Up 5 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp

CONTAINER IDをコピーします。

コンテナに接続

docker exec -it 32b99b6a0b1a bash  

MySQLに接続

mysql -u root -p                            
Enter password: 

データベース確認

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| example            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

テーブル確認

mysql> use example;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

mysql [example]> show tables;
+-------------------+
| Tables_in_example |
+-------------------+
| users             |
+-------------------+

データ確認

mysql [example]> select * from users;
+---------+-----------+---------------------+
| user_id | user_name | user_created_at     |
+---------+-----------+---------------------+
|       1 | Michael   | 2021-08-14 11:22:53 |
+---------+-----------+---------------------+

変更が反映されない場合

マウントしたsqlは初回起動時のみ実行されるのでinit.sqlを編集して再度適用させたい場合は、docker-compose downで一度コンテナを削除してから再度docker-compose up -dしてみてください。

参考