Redmineインストール from Docker Hub
CentOS7上にRedmineをdocker hubから最新版~~(3.3.3)~~(3.3.4)を取得してきてインストールしてみたときのメモ
実際にデータのバックアップ・リストアを行ってみたので更新(2017/04/20)
redmine(3.3.4)とpostgres(9.6.3)のバージョンが上がっていたので、手元の環境をバージョンアップしたときのメモを追加(2017/07/06)
環境は CentOS 7.3.1611、docker-1.12.6
イメージの取得
docker hubよりイメージを取得する。コンテナ起動時に自動的に取得するだろうけど、一応先に取得しておく。
$ docker pull redmine:3.3.4
$ docker pull postgres:9.6.3
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/redmine 3.3.4 e973f4256163 36 hours ago 638.3 MB
docker.io/postgres 9.6.3 f8d91fbcfa35 7 days ago 268.8 MB
構成
永続化のためのデータボリュームを先に作成しておき、DB(postgres)、redmineを起動する。
永続化するデータは、以下の通り。
- postgres DB(/var/lib/postgresql/data)
- redmine files(/usr/src/redmine/files)
- redmine plugins(/usr/src/redmine/plugins)
- redmine vendor/plugins(/usr/src/redmine/vendor/plugins)
- redmine public/themes(/usr/src/redmine/public/themes)
redmineのテーマも永続化の対象にした。
redmine起動
データボリュームの作成
dockerのデータボリュームを先に作成、出来上がっていることを確認する。
$ docker volume create --name main-redmine-db
$ docker volume create --name main-redmine-files
$ docker volume create --name main-redmine-plugins
$ docker volume create --name main-redmine-vplugins
$ docker volume create --name main-redmine-themes
redmineを構成するコンテナの起動
- DB(postgres)コンテナを起動
$ docker run -d --restart=always --name main-postgres \
-v main-redmine-db:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=rdpassword -e POSTGRES_USER=redmine postgres:9.6.3
0f533f196ef0bd1516da24239f971a3fa6b35adf03f4f83f6f0c676c95c1d862
$
- redmineを起動
$ docker run -d --restart=always --name main-redmine \
-v main-redmine-files:/usr/src/redmine/files \
-v main-redmine-plugins:/usr/src/redmine/plugins \
-v main-redmine-vplugins:/usr/src/redmine/vendor/plugins \
-v main-redmine-themes:/usr/src/redmine/public/themes \
-e REDMINE_DB_PASSWORD=rdpassword \
-p 80:3000 --link main-postgres:postgres redmine:3.3.4
ec2365d662ceb835e3c9a5a84e4b8e5d4cacdba291442567dc79b9fda15bc61f
$
ここで、プラグインを入れたときにいくつか気になることが起きたので、先に対応しておく。
DBの反映を行ったときに以下のメッセージが出る。
$ RAILS_ENV=production bundle exec rake redmine:plugins:migrate
`/home/redmine` is not a directory.
Bundler will use `/tmp/bundler/home/unknown' as your home directory temporarily.
bundleのキャッシュ領域をホームディレクトリ配下に作成するが、/home/redmine が無いために出力している。先に作成しておく。
/tmp/bundler/home/unknown で問題は無いが、不要なメッセージが出るのは嫌なので対処しておく。
docker exec main-redmine mkdir -pm 755 /home/redmine
docker exec main-redmine chown redmine.redmine /home/redmine
必要とするコマンド(unzip、ghostscript)が入っていない。
プラグインのいくつかは、zip形式で公開されている物がある。
オフィシャルなイメージではなく、unzipコマンドが入っているイメージを使えばいいのだろうけど、やはりオフィシャルを使用したいので、最初にコマンドをインストールしておく。また、ghostscriptが入っていないとpng作成で失敗するので、入れておく。
docker exec main-redmine apt-get -y update
docker exec main-redmine apt install -y unzip ghostscript
http://localhost でredmineが起動していることを確認する。
データのバックアップ
データのバックアップは、ホスト側にファイルを格納する形で行うが、コンテナ側からホスト側を参照するためには、バックアップディレクトリに SELinux コンテキスト ( svirt_sandbox_file_t )を付与していないと、コンテナ内から、書き込みが出来ない。
redmineデータのバックアップ
redmineデータのバックアップは redmineイメージを使用してバックアップを行う。
--volumes-from を使用し、main-redmine コンテナを読み込み専用で参照し、ホスト側に tar 形式でバックアップを作成する。
postgresデータのバックアップは、pg_dumpコマンドを使用してバックアップを行う。
ホスト側に tar 形式のバックアップを作成する。
$ mkdir -pm 775 $PWD/backup
$ chcon -t svirt_sandbox_file_t $PWD/backup
$ docker run --rm -v $PWD/backup:/backup --volumes-from main-redmine:ro redmine:3.3.4 \
tar zcf /backup/redmine_backup.tar.gz -C /usr/src/redmine files plugins vendor public/themes
$ docker run --rm -ti -v $PWD/backup:/backup --link main-postgres:postgres postgres:9.6.3 \
pg_dump -h postgres -p 5432 -U redmine -W -Fc -f /backup/redmine-db.dmp redmine
Password:rdpassword
データのリストア
バックアップしたデータのリストアできるかを確認、主に動かしている環境とは別にコンテナを作成する。
redmineを起動するが、バックアップ元のredmineを動かしたままにしてあるので、待ち受けポート番号は80ではなく、20080に変更している。
あとは、各リソースの「main-」が「test-」に変わっただけで、最初のredmineと同様に起動する。
- リストア確認用データボリュームを作成する。
$ docker volume create --name test-redmine-db
$ docker volume create --name test-redmine-files
$ docker volume create --name test-redmine-plugins
$ docker volume create --name test-redmine-vplugins
$ docker volume create --name test-redmine-themes
- リストア確認用DB(postgres)、redmineを起動
$ docker run -d --name test-postgres \
-v test-redmine-db:/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=rdpassword -e POSTGRES_USER=redmine postgres:9.6.3
$ docker run -d --name test-redmine \
-v test-redmine-files:/usr/src/redmine/files \
-v test-redmine-plugins:/usr/src/redmine/plugins \
-v test-redmine-vplugins:/usr/src/redmine/vendor/plugins \
-v test-redmine-themes:/usr/src/redmine/public/themes \
-e REDMINE_DB_PASSWORD=rdpassword \
-p 20080:3000 --link test-postgres:postgres redmine:3.3.4
- postgresデータのリストア
$ mkdir -pm 775 /dev/shm/backup
$ cp -p redmine-db.dmp /dev/shm/backup/.
$ sudo chcon -t svirt_sandbox_file_t /dev/shm/backup
$ docker run --rm -ti -v /dev/shm/backup:/backup:ro --link test-postgres:postgres postgres:9.6.2 \
pg_restore -h postgres -p 5432 -U redmine -d redmine -W -c -Fc /backup/redmine-db.dmp
Password:rdpassword
この時、以下のようなエラーが大量に出たが、ここでも
-c オプションを付けたとき、「データが無いとき害のないメッセージをいくつか出力するかもしれません。」とある。
とりあえず、無視する。
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2795; 2606 17589 FK CONSTRAINT easy_settings fk_rails_31c4b01147 redmine
pg_restore: [archiver (db)] could not execute query: ERROR: relation "public.easy_settings" does not exist
Command was: ALTER TABLE ONLY public.easy_settings DROP CONSTRAINT fk_rails_31c4b01147;
(略)
pg_restore: [archiver (db)] Error from TOC entry 186; 1259 16393 SEQUENCE attachments_id_seq redmine
pg_restore: [archiver (db)] could not execute query: ERROR: sequence "attachments_id_seq" does not exist
Command was: DROP SEQUENCE public.attachments_id_seq;
pg_restore: [archiver (db)] Error from TOC entry 187; 1259 16395 TABLE attachments redmine
pg_restore: [archiver (db)] could not execute query: ERROR: table "attachments" does not exist
Command was: DROP TABLE public.attachments;
WARNING: errors ignored on restore: 329
redmineデータのリストア
$ mkdir -pm 775 /dev/shm/backup
$ cp -p redmine_backup.tar.gz /dev/shm/backup/.
$ sudo chcon -t svirt_sandbox_file_t /dev/shm/backup
$ docker run --rm -v /dev/shm/backup:/backup:ro --volumes-from test-redmine -u redmine redmine:3.3.4 \
tar xvf /backup/redmine_backup.tar.gz -C /usr/src/redmine
redmineのデータリストアでも以下のようなエラーが出た。原因は、バックアップ元の vendor/plugins のオーナが root:rootに
なっているため、tarコマンドがファイル情報の更新に失敗したようだ。 無視する。
tar: vendor/plugins: Cannot utime: Operation not permitted
一応、コンテナを再起動。(必要ないかもしれないが、気分で ^^;)
$ docker stop test-redmine
$ docker stop test-postgres
$ docker start test-postgres
$ docker start test-redmine
http://localhost:20080 でredmineが起動していることを確認する。
コピー元と同じようにアクセスできているようだ。
ガントチャートでPNGでインターナルエラー
redmineコンテナ作成時にghostscriptをインストールするので、発生しない。
上記で作成したredmine環境で、ガントチャートの他の形式にエクスポートでPNGを選択するとInternalErrorが発生してしまう。
最初、日本語のフォントが無いのかと考えたけど。。。
# apt update
# apt search ipa
# apt install fonts-ipaexfont
# fc-list
やはりダメだった。 仕方が無いので普通にホスト側から strace コマンドで直接コンテナのプロセスが呼び出しているシステムコールをトレースしてみる。
3867 execve("/usr/local/sbin/gs", [....]) = -1 ENOENT (No such file or directory)
(略)
3867 execve("/bin/gs", [....]) = -1 ENOENT (No such file or directory)
ghostscriptが無かったのが原因のようだ。ghostscriptをインストールし、docker-redmineを再起動すると一応表示された。
# apt install ghostscript
しかし、~~InternalErrorは無くなったが、~~日本語が化ける。すでに解決方法はあるようだ。
ガントチャートをPNG形式の画像に出力すると文字化けする
default:
# 日本語に対応したフォントのパスを指定。値は環境によって異なる。
rmagick_font_path: /usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf
だたし、上記の対応でエラーは起きなくなったが、変更は main-redmine コンテナに対して行っているため、リストアを行った test-redmine コンテナについては、リストア後もエラーとなっている。この場合は、「docker commit main-redmine」でコピー元のイメージを作成し、そのイメージを使用してリストア環境の作成が必要かもしれない。
最後に
オフィシャルなイメージを使用しても、きちんと使おうとするとなんらか手を加えていかないといけない。もっと楽をする方法は無いものか。