📌

docker-composeでMySQLを起動する

2022/03/02に公開

【環境】
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が正常に動作していることが確認できました。

参考

https://qiita.com/NagaokaKenichi/items/ae037963b33a85df33f5
https://qiita.com/nanakenashi/items/180941699dc7ba9d0922

Discussion