Windows の VirtualBox + docker-compose + mysql という組み合わせで、
初期データの 文字化け が回避できず苦しんだが、解決できたのでメモ。
結論
mysql の文字コード指定で、
volumes:
- "mysql.conf.d:/etc/mysql/conf.d"
の代わりに下記を指定する。
command: >
mysqld
--character-set-server=utf8
--collation-server=utf8_unicode_ci
--skip-character-set-client-handshake
つまり、command で mysqld の引数に下記を指定する。
--character-set-server=utf8--collation-server=utf8_unicode_ci--skip-character-set-client-handshake
※ skip-character-set-client-handshake はクライアント設定に関係なく utf8 を強制する。
これでOK。
なお、今回の件で判ったのだが Windows 環境で /etc/mysql/conf.d を使う場合は注意が必要だ。
文字化けする条件
- Windows で VirtualBox を使っている。
-
my.cnfをvolumesの/etc/mysql/conf.dで渡している。 - その
my.cnfは Windows 上のファイルであり、マウント経由で VirtualBox からアクセスしている。
この場合、実は my.cnf が読まれない。
なぜ /etc/mysql/conf.d を使うとうまくいかないのか
通常なら /etc/mysql/conf.d を設定することで独自の my.cnf を配置することができるので、この機能を使って文字コード周りの設定をするのだと思う。
ただし、Windows の VirtualBox でマウントしてるディレクトリから my.cnf を提供しようとすると、簡単にはできない。
その理由が下記:
-
mysqlは File の Permission が777の.cnfを読まない。 - Windows からマウントしているディレクトリ/ファイルはすべて
777になる。 -
/etc/mysql/conf.dで volume 指定したファイルも777になる。
これを指定して実行すると mysql は起動するものの、ログをよく見ると下記のメッセージが出ている。
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
Permission が 777 になってたから無視したよ、という意味だ。
つまり、my.cnf を読ませるためには、マウント経由で渡す Windows 上のファイルではダメで、
何らかの方法で VirtualBox 上で作成(or コピー)したファイルを渡さなくてはならなかった、ということ。
/etc/mysql/conf.d を使いたいならどうすればいいのか
mysql の image を直接使わずに Dockerfile を1段階噛ませて、その中でマウント経由でアクセスするファイルを VirtualBox 上にコピーしてしまえば動くはず。