MySQLコンテナーをすぐに使う方法
自身のローカル環境で自由に操作できるMySQL環境がほしいことがあったのでやったことをメモ。
やることは2つです。
- DB初期化用SQLの準備
- 起動するためのシェルスクリプトの準備
DB初期化用SQL
これはなくても良いです。コンテナー起動後にいつも行う操作(テーブル作成など)があるのであれば用意したほうが便利です。
例えば、以下のようなファイルを用意します。この例では、DBとテーブルを作成してテストデータを投入しています。
~/mysql-docker $ cat init_sql.d/init.sql
create database hagiwara_test;
use hagiwara_test;
CREATE TABLE `test` (
`id` varchar(36) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
`shop_id` bigint(20) unsigned NOT NULL,
`item_id` varchar(255) NOT NULL DEFAULT '',
`price` int(11) unsigned NOT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`created_at` timestamp NOT NULL,
`updated_at` timestamp NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `test` VALUES
('0000097e-e3ab-19eb-b72b-0a5c527364fe',101,'i101',101,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('00009d5f-e3ab-19eb-b72b-0a5c527364fe',102,'i102',102,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('000125c3-e3ab-19eb-b72b-0a5c527364fe',103,'i103',103,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('0001b04d-e3ab-19eb-b72b-0a5c527364fe',104,'i104',104,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('00024161-e3ab-19eb-b72b-0a5c527364fe',105,'i105',105,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('0002c9cc-e3ab-19eb-b72b-0a5c527364fe',106,'i106',106,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('00034de0-e3ab-19eb-b72b-0a5c527364fe',107,'i107',107,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00'),
('0003c922-e3ab-19eb-b72b-0a5c527364fe',108,'i108',108,NULL,'2021-07-09 01:00:00','2021-07-09 01:00:00');
起動するためのシェルスクリプト
docker-compose.ymlでもいいのですが今回はシェルスクリプトにしました。
シェルスクリプトで行っていること
まず、同じ名前のコンテナーがあるかもしれないので削除して、新しくMySQLコンテナーを開始します。開始の際に先述の初期化用SQLのディレクトリーパスを指定してます。こうすることでDBを初期化できます。初期化用SQLがなければ-vオプションは指定しません。
それからMySQLの初期化処理が終わるまで待ってからMySQLへ接続します。すぐに接続してしまうとMySQLの初期化が終わっておらずにエラーとなります。待つ秒数は適当です。私の環境では15秒くらいでしたが、ここは環境によって変えて良いです。
補足
--passwordオプションは危険ですよとワーニングが出る通りあまり好ましくありません。自分のローカルPCでやる程度には良いでしょうが、そのほかの場所ではやらないようにしましょう。安全なパスワードの管理についてはこちらが参考になるかと思います。
#!/usr/bin/env bash -e
# 昔のコンテナーが残っているかもしれないため削除する
docker rm -f some-mysql
# コンテナーを起動
# -vオプション:
# 初期化用SQLが入ったディレクトリーを"絶対パス"で指定する。(相対パスではエラーになる)
# いらない場合は行を消す。
docker run \
--name some-mysql \
-v /path/to/mysql-docker/init_sql.d:/docker-entrypoint-initdb.d \
-d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-p 3306:3306 \
mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
# コンテナー自体は起動しているがMySQLの初期化処理に10秒ほどかかるので待つ。
# 15秒待つようにしているが環境によっては15秒もいらないかもしれな。環境によって調整すること。
max=15
for ((i=0; i < $max; i++)); do
remaining=`expr $max - $i`
printf "\rInitializing... Wait for $max seconds. $remaining seconds remaining."
sleep 1
done
# テーミナルが見やすいように1行空ける
echo ""
# MySQLへ接続
mysql -h 127.0.0.1 --user=root --default-character-set=utf8mb4 --password=my-secret-pw hagiwara_test
シェルスクリプトをrun.shなどとしてbash run.shすることでMySQLが立ち上がり接続できます。
この記事が気に入ったらサポートをしてみませんか?