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 上にコピーしてしまえば動くはず。