背景
DockerでMySQLのコンテナを立てて、いろいろしてみようと思っていたところ、日本語対応していないことに気がついた。
記事を探してみると、解決方法がいっぱいでてきた。読んでみると、Debian版のmysqlイメージを使用して、aptを駆使して日本語対応しようという方法だった。
でも、armアーキテクチャでは、Debian版は対応していないっぽい。
M1搭載Macだと、Oracle Linux版mysqlイメージで日本語対応させるしかなさそう。
failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:159ec
MySQLを日本語対応する方法
なんでもいいから、とりあえずMySQLコンテナを日本語化したい人は飛ばしてくださいな。
mysqlのイメージのもととなるイメージは「Oracle Linux slim」が使用されているので、もろもろのインストールはmicrodnf
コマンドを使う。
Oracle Linux slimで、次の操作をすると、日本語の環境になる。
$ sudo microdnf update -y
$ sudo microdnf install -y glibc-locale-source
$ sudo localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
$ export LANG=ja_JP.UTF-8
$ export LC_ALL=ja_JP.UTF-8
$ locale #きちんと変更されているかの確認
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=ja_JP.UTF-8
MySQLコンテナの日本語化の方法
先ほどの方法をdocker-composeで設計すると以下のようになる。
% tree
.
├── docker-compose.yml
└── Dockerfile
version: "3"
services:
mysql:
container_name: "mysql"
hostname: "mysql"
build:
context: "."
dockerfile: "Dockerfile"
# ボリューム
volumes:
- ./mysql/conf.d/:/etc/mysql/conf.d/
- ./mysql/.db/:/var/lib/mysql # データベースのデータを残すため
ports:
- "3306:3306"
FROM mysql:8
ENV MYSQL_ROOT_PASSWORD password
ENV MYSQL_DATABASE admin-device
ENV TZ "Asia/Tokyo"
RUN microdnf update -y \
&& microdnf install -y glibc-locale-source \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
追記
「もしかしたら、この設定も必須かもしれない」と思い、追記しました。
MySQLの設定は、/etc/mysql/conf.d/my.cnf
に記載すればいいみたい。
なので、こんな感じのmy.cnf
に。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
以下のようなディレクトリにして、Dockerfileも編集しておく。(composeファイルはそのままで大丈夫)
また、データベースの初期化を行いたい場合は、init.dというディレクトリを作成して、sqlファイルをぶち込んでおく。
% tree
.
├── docker-compose.yml
├── Dockerfile
├── conf.d
│ └── my.cnf
└── init.d
└── init.sql
FROM mysql:8-oracle
ENV MYSQL_ROOT_PASSWORD password
ENV TZ "Asia/Tokyo"
RUN microdnf update -y \
&& microdnf install -y glibc-locale-source \
&& localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8
COPY conf.d /etc/mysql/conf.d
COPY init.d /docker-entrypoint-initdb.d
Dockerfileの最後の2行に、ローカルのディレクトリをコンテナ内にコピーする命令を追加した。
これで、M1 MacのDockerでMySQLコンテナの日本語化&初期化が可能。