RedmineのDockerコンテナとMySQLで日本語を使えるようにするまで

こんにちは。ドハマりしたので備忘録。
表題の通り、DockerのRedmineMySQLのコンテナをDocker composeで組み合わせ、日本語が使用するまでのメモです。

RedmineのDBをMySQLへの切り替える

デフォルトはSQLiteになっているので、DBドライバをMySQLに切り替えます。 公式コンテナのドキュメントに書かれています。

  • MySQLコンテナ
    • MYSQL_ROOT_PASSWORDにパスワードを指定
    • MYSQL_DATABASEredmineを指定(固定? 任意の値に変更可能?)
  • Redmineコンテナ
    • REDMINE_DB_MYSQLという環境変数にMySQLコンテナの名前を指定
    • REDMINE_DB_PASSWORDにMySQLコンテナに指定したパスワードを指定

これでMySQLに切り替わります。Railsサーバが起動し画面でのアクセスも可能です。
でも管理画面でデフォルト設定をロードしようとすると

redmine "Mysql2::Error: Incorrect string value"

というエラーが。

"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

再起動してみるとデフォルト設定をロードできました。
ということでコンテナを破棄してもう一度マイグレーションからやり直したらこんなエラーが。

"Mysql2::Error: Specified key was too long"を解消する

結局、恒久的な対応策が見つかりませんでした。

Fixed by 8744632 😁
MySQL UTF8MB4 breaks ActiveRecord schema setup · Issue #9855 · rails/rails

Githubを探すと↑のissueが出てきたのですが、これで治らんということはおそらくRedmineコンテナのRailsにこの修正が当たっていないのだろう。
MySQLの文字コードをutf8mb4からutf8に変更したところ治りました。
暫定的な対応ではなくきれいに直したかったけど、とりあえず治ったのでいいか。
暇な時に調べてみます。