Docker ComposeでRedmineを立てるときに文字コードで困った話

Redmineを触ってみたい
|> Redmineで自分のタスクを管理しよう
|> どうせならDockerでやろう
|> 文字コードで困った!
ということでDocker Composeを使ってRedmineを立てる方法と文字コードで困ったこと+その解決方法を書いていきます.
(Elixirの話でもないのにElixirの書き方なのはゴメンナサイ)

 
環境はMacです.

Docker ComposeでRedmine

こちらは簡単です.
RedmineとRedmineで使うMySQLのDockerイメージが公式にあります.
ymlの書き方は公式のRedmineのページの「…via docker-compose」に書いてあるのでこれに従います.

 
ただ,このままだと

  • データの永続化ができない
  • プラグインを入れられない
  • テーマを変更できない

など様々な不都合が出てきます…
ので,コンテナ内の所定のディレクトリをマウントしてホスト側から自由に設定できるようにします.

version: '2'

services:

  redmine:
    image: redmine
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password
    depends_on:
      - db
    volumes:
    - ./files:/usr/src/redmine/files            # 追記
    - ./plugins:/usr/src/redmine/plugins        # 追記
    - ./themes:/usr/src/redmine/public/themes   # 追記
    restart: always

  db:
    image: mariadb
    #command: mount --bind /etc/mysql /usr/local/src/mysql_conf
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine
    volumes:
    - ./mysql:/var/lib/mysql    # 追記
    restart: always

 
これで,プラグイン周りはpluginsに,テーマ周りはthemesで管理できます.
んで,

$ docker-compose up

とすると,Redmineが立ち上がり,localhost:8080 でアクセスできます.

 

エラー発生

よしRedmine使えるようになったぞーと思って触っていたのですが,色々なところでエラーが発生してろくに使えず…

 
で,エラーの内容を見るとDBの文字コード絡みだと分かりました.
(Insertに失敗してるとか出てたのと,日本語が文字化けしてたので)
さらに調べると,Redmineの中で動いているRailsがUTF8なのに対し,MySQL(MariaDB)はlatin1だと分かりました.

 
そりゃ動かないわ( ^ω^ )

 

MySQL(MariaDB)で使うコードをUTF8にする

公式のMySQLのDockerイメージのページを見ても,文字コードを変える設定方法は見つかりませんでした.
(MYSQL_CHARSETとか期待してました…)
少々面倒くさいですが,自分でやることに.

 
docker-compose.yml のMySQLのVolumesに

- ./mysql_conf:/usr/local/src/mysql_conf

を追記し,設定ファイルをやり取りするためのディレクトリをマウントします.

 
起動し直し.

$ docker-compose down
$ docker-compose up

 
MySQLのコンテナIDを確認します.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d70017e991b6        redmine             "/docker-entrypoin..."   40 minutes ago Up 40 minutes       0.0.0.0:8080->3000/tcp   redmine_redmine_1
49c18ea53dc1        mariadb             "docker-entrypoint..."   40 minutes ago Up 40 minutes       3306/tcp                 redmine_db_1

 
MySQLのコンテナの中に入って設定ファイルをコピーします.
(本当は直に編集できれば良かったのですが,ベースのOSがAlpine Linux
でエディタが入ってなかったので致し方なく)

$ docker exec -it 49 /bin/bash
(IDは変わるので各自の環境に合わせてください)
$ docker cp docker-entrypoint.sh /usr/local/src/mysql_conf/

 
ホスト側で編集します.
CREATE DATABASEのときに文字コードを外部から指定できるようにします.

$ code mysql_conf/docker-entrypoint.sh
    ・
    ・
    ・

    file_env 'MYSQL_DATABASE'
    file_env 'MYSQL_CHARSET'    # 追記
    if [ "$MYSQL_DATABASE" ]; then
        echo "CREATE DATABASE IF NOT EXISTS \`$MYSQL_DATABASE\` CHARACTER SET $MYSQL_CHARSET;" | "${mysql[@]}"    # 文字コード部分を追記
        mysql+=( "$MYSQL_DATABASE" )
    fi

    ・
    ・
    ・

 
編集したファイルをMySQLのコンテナの中の本物にコピーします.
コピーしたら,MySQLのコンテナをストップしてイメージを作り直します.

$ docker stop 49
$ docker commit 49 mariadb-tune:latest
(名前は被らなければなんでもOKです)

 
作り直したイメージで起動するのと文字コードを指定するためにdocker-compose.ymlを編集します.

version: '2'

services:

  redmine:
    image: redmine
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: password
    depends_on:
      - db
    volumes:
    - ./files:/usr/src/redmine/files
    - ./plugins:/usr/src/redmine/plugins
    - ./themes:/usr/src/redmine/public/themes
    restart: always

  db:
    image: mariadb-tune      # 編集,作り直したイメージの名前
    #command: mount --bind /etc/mysql /usr/local/src/mysql_conf
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: redmine
      MYSQL_CHARSET: utf8    # 追記,文字コードをUTF8に指定
    volumes:
    - ./mysql:/var/lib/mysql
    restart: always

 
コンテナを再度立ち上げます.

$ docker-compose down
$ docker-compose up

localhost:8080 にアクセスして立ち上がれば,まずはOKです.
で,日本語が使えれば完璧です.
(設定のデフォルト設定の追加とかなんとかでエラー無く追加できればOKです)

 

まとめ

面倒くさい方法でしたが,Docker ComposeでRedmineを立ち上げる+文字コード問題の解決について書きました.
公式で対応して欲しいですね.

では,快適なRedmine生活を〜

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です