ローカルホストの開発環境でとりあえず MySQL を立ち上げたいとき用。
しばらく見ないうちに docker-compose の設定ファイルのバージョンが3.2まで上がっていた…。
volumes
の書き方がちょっと変わっていた。
docker-compose.yml
yml ファイル全体は以下です。
version: '3.2'
services:
db:
image: "mysql:5.7.22"
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: password
ports:
- 3306:3306
volumes:
# For setting up the schema
# https://hub.docker.com/_/mysql/
- type: bind
source: ./docker/db/init.sql
target: /docker-entrypoint-initdb.d/init.sql
# Working dir
- type: bind
source: /tmp/docker/tmpdata
target: /tmp/tmpdata
パスワードの設定
MYSQL_ROOT_PASSWORD
環境変数で root ユーザのパスワードを設定することができます。
MYSQL_USER
, MYSQL_PASSWORD
で任意のユーザ作成とパスワード設定もできます。
初期データベースの設定
MYSQL_DATABASE
環境変数でコンテナ作成時に任意のデータベースを作成することもできますが、テーブル設定も一緒につくりたかったので今回は dump から初期設定をすることにしています。
データベースとテーブルを作成する
docker-compose up -d
で1度コンテナを起動します。
この時点では、まだ dump ファイルがないので volumes の設定は以下のように作業用ディレクトリの bind だけをするようにしておきます。 この bind したディレクトリ以下に dump ファイルを書き出すようにします。
volumes:
- type: bind
source: /tmp/docker/tmpdata
target: /tmp/tmpdata
DDL文を流して、必要なデータベースとテーブルを作成します。
dump を取得する
mysqldump
で dump をとります。
以下の例では --no-data
オプションでデータベースとテーブル定義だけ取るようにしていますが、初期投入データが必要な場合はこのオプションを外せばデータベースに入っている列も dump できます。
MySQL :: MySQL 8.0 Reference Manual :: 4.5.4 mysqldump — A Database Backup Program
root@4f6da29f6e1a:/# mysqldump -p --databases my-database --no-data > /tmp/tmpdata/init.sql
/docker-entrypoint-initdb.d を利用する
dump を取ったらリポジトリの docker 関連ファイルを配置するディレクトリなどに sql ファイルを配置します。
以下のように、/docker-entrypoint-initdb.d
以下に dump した sql ファイルを bind するようにします。
Compose file version 3 reference | Docker Documentation
volumes:
# For setting up the schema
# https://hub.docker.com/_/mysql/
- type: bind
source: ./docker/db/init.sql
target: /docker-entrypoint-initdb.d/init.sql
/docker-entrypoint-initdb.d
以下に配置した sql ファイルは、 docker コンテナ作成時にアルファベット順に実行されます。
複数の SQL ファイルに初期化 SQL を分けて書いても良さそうです。
コンテナの作成
sql ファイルの準備ができたら、上記の docker-compose.yml
を使って
docker-compose up -d
を実行します。
必要なデータベースとテーブル作成が完了した状態で MySQL サーバを起動させることができます。