2021年11月25日木曜日

docker mysql用docker-compose.ymlの記述

 私なりのmysql用のdocker-compose.ymlの記述を決めました。

ここに至る経緯は、なかなか大変でした。



ファイル構成


docker-compose.yml

mysql/Dockerfile

mysql/mysql.env

mysql/conf/my.cnf

mysql/init/01_create_tables.sql



mysql.env


MYSQL_ROOT_HOST=%

MYSQL_ROOT_PASSWORD=パスワード

MYSQL_USER=ユーザー名

MYSQL_PASSWORD=パスワード

MYSQL_DATABASE=データベース名



docker-compose.yml

一部、抜粋

services:

  mysql:

    build:

      context: .

      dockerfile: ./mysql/Dockerfile

    container_name: コンテナ名

    env_file: ./mysql/mysql.env

    environment:

      - TZ=Asia/Tokyo

    expose: 

      - "3306"

    restart: always

    volumes:

      - mysqldata:/var/lib/mysql



Dockerfile


FROM mysql:8.0

COPY ./mysql/conf/* /etc/mysql/conf.d/

COPY ./mysql/init/* /docker-entrypoint-initdb.d/




ファイルの扱い

最初、Dockerfileを用意せず、docker-compose.ymlファイルのvolumesに、my.cnfファイルなどを記述していました。

例えば、

./mysql/conf:/etc/mysql/conf.d/:ro


この場合、コンテナ起動時に、my.cnfファイルが読まれず、エラーが発生しました。

ファイルのパーミッションを変更するか、コンテナ内のmysqlユーザーのUIDを、ファイル所有者と一致させるかすれば、エラーを回避できます。


しかし、この方法は、docker-compose buildを実行する前に、ファイルパーミッションの変更作業か、ファイル所有者のUIDを.envファイルに書き込む手間が必要になります。

後者は、工夫すれば、不要かもしれません。


windowsのWSLで開発し、linuxで実行することを考え、このあたりの処理を不要にするため、コンテナ内に、ファイルをコピーする方法で回避しました。




文字コードの設定


mysqlのコンテナでは、文字コードをutf8mb4に変更する必要があります。

mysql 8.0では、デフォルトの文字コードだと思っていましたが、コンテナでは、latain1になるので、設定変更が必要でした。


この変更は、my.cnfファイルを用意するか、docker-compose.ymlのcommand項目で設定できます。


my.cnfファイルの方が見やすくなるため、こちらの方法を採用しました。


他にも、ポートの公開方法、タイムゾーンの設定など、方法が複数ある中で、上記の記述を選びました。

0 件のコメント:

コメントを投稿