docker-composeでMySQLを起動する
【環境】
MacBook Air (M1, 2020)
OS: MacOS Big Sur version11.6
Docker Desktop for Mac version4.5.0
docker-composeでMySQLを起動します。
ディレクトリ構成
mysql
├── .env_mysql
├── Dockerfile
├── docker-compose.yml
└── init
└── create_table.sh
.env_mysqlには環境変数を記述しました。
initディレクトリはコンテナ起動後に実行されるShellが入っています。
Dockerfile
FROM mysql:8.0
ENV LANG ja_JP.UTF-8
mysqlの8.0をBase Imageにしました。
docker-compose.yml
version: "3.8"
services:
db:
container_name: db
build:
context: .
dockerfile: Dockerfile
platform: linux/x86_64
tty: true
ports:
- 3306:3306
env_file:
- ./.env_mysql
volumes:
- type: volume
source: mysql-data
target: /var/lib/mysql
- type: bind
source: ./init
target: /docker-entrypoint-initdb.d
volumes:
mysql-data:
name: mysql-volume
M1(Apple Silicon)の場合、DockerでMySQLを扱う際はplatformをlinux.x84_64に指定しないとエラーが発生します。
env_fileで指定したファイル(.env_mysql)の環境変数をコンテナ内で参照することができます。
コンテナを閉じてもデータを消さないためにDockerのボリューム(mysql-data)とコンテナの/var/lib/mysqlを紐づけます。(docker-composeでvolumesを設定する)
また、コンテナの/docker-entrypoint-initdb.dとホストの./initディレクトリをバインドマウントします。docker-entrypoint-initdb.d以下にある「.sql」「.sh」「.sql.gz」が拡張子のファイルはコンテナ起動後に自動実行されます。
.env_mysql
MYSQL_DATABASE=test_database
MYSQL_USER=test_user
MYSQL_PASSWORD=password
MYSQL_ROOT_PASSWORD=root_password
.env_mysqlには環境変数を記述します。
MySQL用の特定の環境変数はコンテナ起動時にMySQLインスタンスの設定を変えることができます。(MYSQL_ROOT_PASSWORDでrootユーザーのパスワードを設定など。参考:DockerのMySQLイメージ起動時に渡す環境変数)
create_table.sh
#!/bin/sh
CMD_MYSQL="mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}"
$CMD_MYSQL -e "create table article (
id int(10) AUTO_INCREMENT NOT NULL primary key,
title varchar(50) NOT NULL,
body varchar(1000)
);"
$CMD_MYSQL -e "insert into article values (1, '記事1', '記事1です。');"
$CMD_MYSQL -e "insert into article values (2, '記事2', '記事2です。');"
コンテナの/docker-entrypoint-initdb.dディレクトリにマウントされたファイルは自動的に実行されます。
${環境変数名}で、env_fileに記述した環境変数を読み込むことができます。(「sql」拡張子内で環境変数を使う方法が分からなかったので今回はShellに記述しました。)
articleという名前のテーブルを作成し、データを2つ挿入しています。
やってみる
実際にコンテナを作成してみます。
その前に、initディレクトリ以下のファイルのアクセス権限をchmodコマンドで変更します。
% chmod a+x ./init/*.sh
aは「すべての権限(所有者、グループ、その他)」、xは「実行権限」を意味します。
それではコンテナを起動し、コンテナの内部に入ります。
mysql % docker-compose up -d
mysql % docker exec -it db bash
ユーザー名、パスワード、データベースを指定してMySQLに入ります。
root@175c666d6151:/# mysql -utest_user -ppassword test_database
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.28 MySQL Community Server - GPL
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
articleテーブルが作成されデータが入っているか確認します。
mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| article |
+-------------------------+
1 row in set (0.02 sec)
mysql> select * from article;
+----+---------+------------------+
| id | title | body |
+----+---------+------------------+
| 1 | 記事1 | 記事1です。 |
| 2 | 記事2 | 記事2です。 |
+----+---------+------------------+
1 row in set (0.01 sec)
MySQLと/docker-entrypoint-initdb.dディレクトリのShellが正常に動作していることが確認できました。
参考
Discussion