LoginSignup
0
2

More than 3 years have passed since last update.

DockerでRedmine3.4を動かす

Last updated at Posted at 2019-05-19

DockerでRedmine3.4を動作させた時の作業メモです。
もしよかったら参考にしてください。
わかりづらいところ、間違っているところなどご指摘いただけると嬉しいです。

操作の流れとディレクトリの構成です。

操作の流れ

  1. 作業用のディレクトリの作成
  2. Dockerfileの作成
  3. docker-compose.ymlの作成
  4. 必要なディレクトリの作成
  5. Redmineの設定
  6. Docker Imageの作成
  7. Redmineの環境構築
  8. Redmineの動作

ディレクトリの構成

redmine34/
┣ Dockerfile
┣ docker-compose.yml
┣ entrypoint.sh
┣ redmine/
┣ bundle/
┗ postgresql_data/

1. 作業用のディレクトリの作成

作業用のディレクトリを作成します。
場所と名前は自由です。
今回はホームディレクトリ以下にredmine34という名前で作成します。

$ mkdir ~/redmine34
$ cd ~/redmine34

2. Dockerfileの作成

イメージを作成するためのDockerfileを作成します。今回必要なイメージは2つ。

  1. Redmineを動作させるためのイメージ
  2. Redmineで使用するDBのイメージ

1のイメージはRubyのイメージを元に作成します。2のイメージは、既存のイメージをそのまま使用するので今回はDockerfileは作成しません。
以下がRedmineを動作させるためのイメージのDockerfileです。今回はredmine34/の直下に作成しています。

Dockerfile
FROM ruby:2.4

RUN gem install bundler -v 1.17.3

COPY redmine /var/lib/redmine
WORKDIR /var/lib/redmine

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]

自分がなんとなくわかっているところだけを軽く説明します。

  • FROM ruby:2.4 : 元となるイメージを指定します。今回はRedmineの3.4を動かしたいのでrubyのバージョンを2.4に指定しました。
  • RUN gem install bundler -v 1.17.3 : イメージを作成するために実行するコマンドを指定します。rubyのイメージを使用しているのでgemのコマンドが使えます。Redmineの3.4だと最新のbundlerを使えないので、今回はbundlerのバージョンを1.7.3に指定しています。
  • COPY redmine /var/lib/redmine : ホストのファイルをイメージ上にコピーする指定です。Redmineのソース./redmineをイメージ上の/var/lib以下にコピーしています。Redmineのソースはあとで用意します。
  • WORKDIR /var/lib/redmine : 作業ディレクトリを指定します。今回はRedmineを動かすため、作業ディレクトリは/var/lib/redmineになります。
  • COPY entrypoint.sh /usr/bin/ : entrypoint.sh/usr/lib/以下にコピーします。entrypoint.shはこのあと作成します。
  • RUN chmod +x /usr/bin/entrypoint.s : entrypoint.shに実行権限を付与しています。
  • ENTRYPOINT ["entrypoint.sh"] : 理解不足なのでわかりません。コンテナを起動した時に実行されるんだと思いますが、CMDとの違いがわかりません。
  • EXPOSE 3000 : コンテナ側で解放するポートを指定します。今回はRedmineを動作させるので3000番ポートを解放しています。
  • CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"] : ENTRYPOINTとの違いがわかりません。

entrypoint.shの作成

イメージの中で使用するentrypoint.shを作成します。
Docker公式のRailsのサンプルアプリケーションのものをほとんどそのまま使用しています。
こちらもredmine34/直下に配置します。

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /var/lib/redmine/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

3. docker-compose.ymlの作成

docker-composeは複数のコンテナを連携して動かす(オーケストレーション)際に便利な機能です。docker-composeを使用しない方法もあるため必須ではありませんが、大変便利なので今回は使用します。
以下がdocker-composeを使用するためのdocker-compose.ymlです。

docker-compose.yml
version: '3'

services:
  redmine:
    build: .
    ports:
      - '3001:3000'
    volumes:
      - ./redmine:/var/lib/redmine
      - ./bundle:/usr/local/bundle
    depends_on:
      - db
  db:
    image: postgres:9.6
    ports:
      - '4001:5432'
    volumes:
      - ./postgresql_data:/var/lib/postgresql/data
  • version: '3' : docker-composeのバージョンを指定します。バージョンごとに書き方が変わるようなので書いたほうがいいと思います。
  • services: : サービスを指定します。サービスはコンテナの数分必要になるはずです。今回はRedmine用のサービスredmineとDB用のサービスdbがあります。サービス名(今回でいうところのredminedb)は自由です。サービス名はコンテナを操作する時に使用します。
  • build: . : コンテナはイメージから、イメージはDockerfileを元にして作られますが、そのイメージの元になるDockerfileの場所(コンテキスト)を指定します。今回はredmine34/直下にDockerfileを配置しているので、カレントディレクトリ(.)を指定しています。
  • image: postgres:9.6 : 使用するイメージを指定します。DBのコンテナは既存のイメージから作成するのでpostgres:9.6のイメージを指定します。
  • ports: : ポートフォワードの設定です。ホストのポート:コンテナのポートのように記述します。ホストのポートは使用可能なポートであればなんでも構いません。コンテナのポート番号はサービスごとに決まっており、また、EXPOSEされている必要があります。
  • volumes: : ボリュームを指定します。./redmine:/var/lib/redmineとかくと、コンテナの/var/lib/redmineディレクトリでホストの./redmineディレクトリをマウントする意味になります。redmine:/var/lib/redmineと書くと意味が異なってしまうので、今回のやり方でディレクトリをマウントする場合にはカレントディレクトリ(./)の指定も必要です。
  • depends_on: : コンテナの依存関係を指定します。Redmineの起動には、先にDBが起動している必要があるため、depends_onを使ってDB起動後に起動する指定をしています。

volumesについて

コンテナはdownするごとにデータは消えてしますため、永続化したいデータがある場合はvolumeして外だしにしておく必要があります。
Redmineのデータやpostgresqlのデータは、コンテナの消失とともに初期化されてしまわないように、コンテナから分離しておきます。また、コンテナの起動ごとにgemをインストールするのは非効率なので、/bundleも外だしにしています。
主要なgemはイメージを作成する時にインストールしてしまうのもありかもしれません。

4. 必要なディレクトリの作成

ここまでの手順で、ディレクトリの構成は以下の通りになっています。

redmine34/
┣ Dockerfile
┣ docker-compose.yml
┗ entrypoint.sh

残り必要なディレクトリは以下の4つです。

  1. Dockerfile内でCOPYしているRedmineのソース
  2. docker-compose.yml内でvolumeしてるredmineディレクトリ`
  3. docker-compose.yml内でvolumeしてるbundleディレクトリ`
  4. docker-compose.yml内でvolumeしてるpostgresql_dataディレクトリ`

2で使うredmineディレクトリは、1で使うredmineのソースをそのまま使うので、3つのディレクトリを用意します。RedmineのソースはRedmineのgithubからcloneし、bundlepostgresqlは直接作成します。

$ git clone https://github.com/redmine/redmine.git
$ mkdir bundle postgresql_data

5. Redmineの設定

2019年5月19日現在Redmineの最新バージョンは4.0なので、3.4のブランチに切り替える必要があります。

$ cd redmine
$ git checkout -b 3.4-stable origin/3.4-stable
$ cd ..

database.ymlを編集します。

database.yml
default: &default
  adapter: postgresql
  encoding: utf-8
  host: db
  username: postgres
  password:

development:
  <<: *default
  database: redmine_dev


test:
  <<: *default
  database: redmine_test

docker-compose.ymlで指定したサービス名がDBのホスト名になります。今回ではdbです。
DBのユーザ名はデフォルトのpostgresになります。
DBのホスト名やパスワード等を設定したい場合は、Dockerfileを作成する必要があります。

configuration.ymlの編集は今回は省略します。

6. Docker Imageの作成

次のコマンドでイメージを作成します。

$ docker-compose build

イメージを確認すると作業ディレクトリとサービスの名前からredmine34_redmineという名前のイメージが作成されています。
dbサービスのイメージは今回は作成されません。

$ docker image ls
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
redmine34_redmine           latest              17529e7c8707        4 hours ago         952MB

7. Redmineの環境構築

作成されたイメージから、コンテナを通してRedmineの環境を構築します。
docker-compose runコマンドを使って、redmineに対してコマンドを実行していきます。
以下のコマンドで、指定したサービスに対してコマンドを実行します。

$ docker-compose run [サービス名] [実行コマンド]

ここの[サービス名]は、docker-compose.ymlに記述したサービス名になります。

$ docker-compose run redmine bundle install
$ docker-compose run redmine bundle exec rake generate_secret_token
$ docker-compose run redmine bundle exec rake db:create
$ docker-compose run redmine bundle exec rake db:migrate
$ ls postgresql_data/
PG_VERSION            pg_hba.conf           pg_serial/            pg_twophase/
base/                 pg_ident.conf         pg_snapshots/         pg_xlog/
global/               pg_logical/           pg_stat/              postgresql.auto.conf
pg_clog/              pg_multixact/         pg_stat_tmp/          postgresql.conf
pg_commit_ts/         pg_notify/            pg_subtrans/          postmaster.opts
pg_dynshmem/          pg_replslot/          pg_tblspc/            postmaster.pid

ここまで実行すると、空だったはずのpostgresql_data/にデータが作成されます。
docker-compose runを実行するごとに、コンテナが新しく作成され、[実行コマンド]が終わるとコンテナは止まります。
つまり、ここでは3つのコンテナが作成されて、止まってを繰り返すことになります。

8. Redmineの起動

最後にコンテナを起動します。

$ docker-compose up

DockerfileCMDに記述したコマンドがRedmineのコンテナに対して実行され、Railsのサーバが起動します。
ブラウザからlocalhost:3001にアクセスするとRedmineの画面が表示されます。

DockerでのRedmineのPlugin開発

これは僕がRedmineのプラグインを開発するときのメモです。

コンテナは-dオプションを使ってデタッチモードで立ち上げます。

$ docker-compose up -d

実行中のコンテナに対しては、docker-compose execコマンドを使って操作します。

$ docker-compose exec redmine bundle exec rake redmine:plugins:migrate

コンテナの再起動とlogを確認するコマンドです。

$ docker-compose restart
$ docker-compose logs -tf --tail=100

参考

Quickstart: Compose and Rails | Docker Documentation

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2