MySQL 環境で SQL を書く練習をしたい。この環境は使い捨てにしたいので、Docker で環境を作ることにした。

Docker Hub に MySQL の公式イメージがあるので、目標は簡単に達成できると思っていたが、実際には色々と苦労したので、未来のためここに手順をメモしておく。

苦労したのは日本語の入出力まわりである。Docker イメージ側の設定、mysqld の設定、MySQL クライアントの設定のみっつが必要となる。 具体的には次のようにした。

まずは Dockerfile を適当なディレクトリに置く。内容は次の通りだ。

FROM mysql:8.0.29

RUN apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8

ENV LC_ALL ja_JP.UTF-8

RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'character_set_filesystem=utf8mb4'; \
    echo 'collation-server=utf8mb4_general_ci'; \
    echo 'skip-character-set-client-handshake'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf

この Dockerfile でイメージをビルドする。次のコマンドを叩く。

$ docker build . --tag my-mysql:20220509

すると 20220509 でタグ付けされた my-mysql イメージができあがる。このイメージからコンテナを次のコマンドで起動する。

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw my-mysql:20220509

これで MySQL デーモンがコンテナ内で立ち上がるので、別なウィンドウから次のように MySQL クライアントを起動すればよい。

$ docker exec -ti $(docker ps | grep mysql | awk '{ print $1 }') mysql -uroot -pmy-secret-pw --default-character-set=utf8mb4

問題なく日本語を入力できるし、サーバー側での保存も問題なく動作する。