本記事では、Docker ComposeでMySQLのコンテナを起動します。その際に、初期データを投入できるようにdocker-compose.ymlを設定していきます。
まずは適当なディレクトリにおいて、docker-compose.ymlファイルを作成し、下記のように記述します。
1 2 3 4 5 6 7 8 9 |
version: "3" services: mysql: image: mysql:latest environment: MYSQL_ROOT_PASSWORD: pass volumes: - ./initdb.d:/docker-entrypoint-initdb.d |
9行目
公式のMySQLイメージからコンテナを生成・起動させた場合、コンテナ側の「/docker-entrypoint-initdb.d」ディレクトリに.sqlや.shのファイルを配置すると、そのファイルが自動的に実行され初期データとしてMySQLに投入されるようになります。そのためにはホスト側とコンテナ側のディレクトリをマウントし、ホスト側にあらかじめ初期データ用のファイルを準備しておく必要があります。上記では、ホスト側に「initdb.d」ディレクトリを作成し、コンテナ側の「/docker-entrypoint-initdb.d」ディレクトリにマウントさせています。
次に初期データとしてのsqlファイルをinitdb.dディレクトリ内に用意します。docker-compose.ymlファイルと同ディレクトリに、initdb.dディレクトリを作成し、その中にinit.sqlというファイルを作成します。
ディレクトリ構造は下記のようになります。
1 2 3 4 5 6 |
tree . ├── docker-compose.yml └── initdb.d └── init.sql |
init.sqlファイルは下記のように記述しました。sample01データベースを作成したらnameテーブルを作成し、その中に太郎、花子、令和というデータを投入しています。
1 2 3 4 5 6 7 8 9 10 11 |
DROP DATABASE IF EXISTS sample01; CREATE DATABASE sample01; USE sample01; DROP TABLE IF EXISTS name; CREATE TABLE name ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name TEXT NOT NULL )DEFAULT CHARACTER SET=utf8; INSERT INTO name (name) VALUES ("太郎"),("花子"),("令和"); |
コンテナを起動させます。
1 |
docker-compose up -d |
起動しているコンテナの確認。
1 2 3 4 |
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 804ac4aa3cab mysql:latest "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 3306/tcp, 33060/tcp sample_mysql_1 |
コンテナに入り、MySQLに接続。
1 2 3 |
docker exec -it 804ac4aa3cab /bin/bash root@804ac4aa3cab:/# mysql -uroot -ppass |
sample01データベースを確認。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sample01 | | sys | +--------------------+ 5 rows in set (0.00 sec) |
nameテーブルに初期データが投入されていることを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
mysql> USE sample01; 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> SHOW TABLES; +--------------------+ | Tables_in_sample01 | +--------------------+ | name | +--------------------+ 1 row in set (0.00 sec) mysql> SELECT * FROM name; +----+--------+ | id | name | +----+--------+ | 1 | 太郎 | | 2 | 花子 | | 3 | 令和 | +----+--------+ 3 rows in set (0.00 sec) |
関連ページ