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生活を〜