Help us understand the problem. What is going on with this article?

Redmineインストール from Docker Hub

More than 3 years have passed since last update.

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形式の画像に出力すると文字化けする

configuration.yml
default:
  # 日本語に対応したフォントのパスを指定。値は環境によって異なる。
  rmagick_font_path: /usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf

だたし、上記の対応でエラーは起きなくなったが、変更は main-redmine コンテナに対して行っているため、リストアを行った test-redmine コンテナについては、リストア後もエラーとなっている。この場合は、「docker commit main-redmine」でコピー元のイメージを作成し、そのイメージを使用してリストア環境の作成が必要かもしれない。

最後に

オフィシャルなイメージを使用しても、きちんと使おうとするとなんらか手を加えていかないといけない。もっと楽をする方法は無いものか。

参考

Redmineの公式Dockerイメージを例に、自分に合ったDockerの使い方を探る

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした