こんにちは。ドハマりしたので備忘録。
表題の通り、DockerのRedmineとMySQLのコンテナをDocker composeで組み合わせ、日本語が使用するまでのメモです。
デフォルトはSQLiteになっているので、DBドライバをMySQLに切り替えます。 公式コンテナのドキュメントに書かれています。
MYSQL_ROOT_PASSWORD
にパスワードを指定MYSQL_DATABASE
にredmine
を指定(固定? 任意の値に変更可能?)REDMINE_DB_MYSQL
という環境変数にMySQLコンテナの名前を指定REDMINE_DB_PASSWORD
にMySQLコンテナに指定したパスワードを指定これでMySQLに切り替わります。Railsサーバが起動し画面でのアクセスも可能です。
でも管理画面でデフォルト設定をロードしようとすると
redmine "Mysql2::Error: Incorrect string value"
というエラーが。
エラーメッセージを見る限り、まぁ文字コード系だろうなぁ。という感触。
調べてみるとやっぱり同様の問題が。
rails – Mysql2::Error: Incorrect string value – そういうことだったんですね
ということでMySQLコンテナにエンコーディング周りの設定を追加します。
設定をまるごと上書きする必要はないと判断し、差分だけ書き足し/etc/mysql/conf.d
にマウントする方式で対応します。
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
MySQL 5.5からutf8mb4
に対応していたそうなので、せっかくなので指定してみる。
UTF-8mb4は4バイト対応のUTF-8だそうです。絵文字とか特殊文字とか稀に存在する4バイトにも対応しているエンコーディング。
詳しくはこちらが参考になりました。
RDS MySQL5.5.33 で『utf8mb4』(4バイト対応UTF-8文字コードセット)を試してみた | Developers.IO
これをdocker-compose.yml上でマウントします。
# ...
redmine:
image: 'redmine:2.6'
environment:
- MYSQL_PORT_3306_TCP=1
- REDMINE_DB_MYSQL=redmine_db
- REDMINE_DB_PASSWORD=root
depends_on:
- redmine_db
redmine_db:
image: mysql:5.6
volumes:
- ./docker/db/multibyte.cnf:/etc/mysql/conf.d/multibyte.cnf
再起動してみるとデフォルト設定をロードできました。
ということでコンテナを破棄してもう一度マイグレーションからやり直したらこんなエラーが。
結局、恒久的な対応策が見つかりませんでした。
Fixed by 8744632 😁
MySQL UTF8MB4 breaks ActiveRecord schema setup · Issue #9855 · rails/rails
Githubを探すと↑のissueが出てきたのですが、これで治らんということはおそらくRedmineコンテナのRailsにこの修正が当たっていないのだろう。
MySQLの文字コードをutf8mb4
からutf8
に変更したところ治りました。
暫定的な対応ではなくきれいに直したかったけど、とりあえず治ったのでいいか。
暇な時に調べてみます。