🐬

公式サンプルを公式Dockerイメージに入れる(MySQL編)

2024/08/26に公開

はじめに

サンプルデータベースが欲しくなったのですが、最近は見かけないような気がします。
昔々は、scott/tiger でつないで EMP テーブルで練習するのがお約束でしたが…。
調べてみることにしました。

最初は、サンプルデータベースの場所だけの備忘録にしようと思ったのですが、ちょっとデータベースを使ったデモとかテストが必要になったので、サンプルデータベース入りの Docker イメージを作って、イメージを作る材料もイメージも公開しようと思います。

MySQL 編

MySQL には似たような記事がいくつかあります(苦笑)。
基本的には、以前の PostgreSQL の派生形なので、同じです。
https://zenn.dev/robon/articles/6071ebdff6e2f5

公式 Docker イメージ

オフィシャルイメージは、以下にあります。
https://hub.docker.com/_/mysql

このイメージをメンテナンスしているのが、以下です。
https://github.com/docker-library/mysql

このオフィシャルイメージの Initializing a fresh instance に書かれています。

When a container is started for the first time, a new database with the specified name will be created and initialized with the provided configuration variables. Furthermore, it will execute files with extensions .sh, .sql and .sql.gz that are found in /docker-entrypoint-initdb.d. Files will be executed in alphabetical order. You can easily populate your mysql services by mounting a SQL dump into that directory⁠ and provide custom images⁠ with contributed data. SQL files will be imported by default to the database specified by the MYSQL_DATABASE variable.

なので、これまで同様、.sql.sh/docker-entrypoint-initdb.d に置いておけば良いということです。

公式サンプル

公式サンプルは、以下にありました。
https://dev.mysql.com/doc/index-other.html

今回は、sakila database を組み込むことにします。

Docker イメージを作る

本当は、作らなくても、/docker-entrypoint-initdb.d-v でマウントすれば終了なんだけど、組み込んでしまった方が楽なんじゃないの?ということで作ります。

SQLファイル

sakila-db.tar.gz を解凍して、sakila-schema.sqlsakila-data.sql を使います。
Docker イメージの大きさの問題もあるので、build する際は、.sql.gz に圧縮します。

Dockerfile

Dockerfile
FROM mysql
COPY ./sakila-db/sakila-schema.sql.gz /docker-entrypoint-initdb.d/01.sql.gz
COPY ./sakila-db/sakila-data.sql.gz /docker-entrypoint-initdb.d/02.sql.gz

そのまんまです。
コピー先を 01.sql.gz02.sql.gz にしているのは、オフィシャルイメージに書いてあった Files will be executed in alphabetical order. 対策です。

Makefile

Makefile
.PHONY: build run push clean

IMAGE=docker.io/take0a/mysql-sakila
CONTAINER=mysql01
PASSWORD=password

build: clean
	gzip -k sakila-db/*.sql 
	docker build . -t $(IMAGE) --no-cache

run:
	docker run --name $(CONTAINER) -dit -e MYSQL_ROOT_PASSWORD=$(PASSWORD) $(IMAGE)
	docker exec -it $(CONTAINER) /usr/bin/mysql -p

push:
	docker push $(IMAGE)

clean:
	docker container rm $(CONTAINER) -f
	docker image rm $(IMAGE) -f
	rm -f sakila-db/*.sql.gz

こんな感じにしておくと、コマンドを忘れて「あわわ」しなくてすみます。

Docker イメージ

以下で公開しました。
https://hub.docker.com/r/take0a/mysql-sakila

docker pull take0a/mysql-sakila で pull できます。

GitHub リポジトリ

以下で公開しました。
https://github.com/take0a/docker-library/tree/main/mysql

他のデータベースのものも公開したら、少しきれいにしておきます。

おわりに

やはり、サンプルデータベースは必要ですよね。

GitHubで編集を提案
株式会社ROBONの技術ブログ

Discussion