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が立ち上がり接続できます。

この記事が気に入ったらサポートをしてみませんか?