search
LoginSignup
21

More than 5 years have passed since last update.

posted at

updated at

Windows + docker-compose + mysql で文字化けさせない方法

WindowsVirtualBox + 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

つまり、commandmysqld の引数に下記を指定する。

  • --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.cnfvolumes/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 を使いたいならどうすればいいのか

mysqlimage を直接使わずに Dockerfile を1段階噛ませて、その中でマウント経由でアクセスするファイルを VirtualBox 上にコピーしてしまえば動くはず。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
21