Redmineのプラグインを作っていると複数のバージョンのRedmineに自分のプラグインが対応しているかどうか確認したくなることがあります。
結論はリンク先を見てください。
docker-composeを使って複数バージョンのRedmineに対してプラグインのテストをする方法
MariaDB(MySQL)とPostgreSQLに対応した全文検索用のプラグインを作っているのですが、複数バージョンのRedmineに対する動作を確認したくなったので方法を考えてdocker-compose.ymlを書きました。
方針は以下の通りです。
- docker-compose.yml で書ける範囲でがんばる (Dockerfileは書かない)
- 配布されているDockerイメージでがんばる
- データベースはホスト環境にインストールしているものを使う
- MroongaのDockerイメージはあるけど、PGroongaのDockerイメージはないため既にホストに入っているものを活用したい
- プラグインは、Dockerイメージ内にコピーしない
- プラグインの動作確認用なので、セキュリティについてはあまりガチガチにしない
version: "2"
services:
redmine-3.2-mariadb:
image: redmine:3.2
ports:
- "3011:3000"
environment:
REDMINE_DB_MYSQL: mariadb
REDMINE_DB_DATABASE: redmine-3.2
env_file:
- env
extra_hosts:
- "mariadb:172.17.0.1"
volumes:
- .:/usr/src/redmine/plugins/full_text_search:ro
最初の1つができたらあとはコピーして増やすだけなので、1つ例を上げて説明します。
ホスト側のポート番号は、複数のRedmineを同時に上げて確認することもあるのでユニークになるようにします。
環境変数は、以下の4つを設定します。
-
REDMINE_DB_MYSQL
orREDMINE_DB_POSTGRES
: データベースのホスト名を指定します -
REDMINE_DB_DATABASE
: データベースの名前を指定します -
REDMINE_DB_USERNAME
: データベースに接続するユーザー名を指定します -
REDMINE_DB_PASSWORD
: データベースの接続に使用するパスワードを指定します
ユーザー名とパスワードは他のバージョンのRedmineでも共通にしておいた方が設定が楽になるので、上の例では REDMINE_DB_USERNAME
, REDMINE_DB_PASSWORD
は env_file
にまとめています。
extra_hosts
にはREDMINE_DB_MYSQL
(REDMINE_DB_POSTGRES
)に設定したホスト名とDockerコンテナ内からホストにアクセスするためのIPアドレスを書きます。これを書いておくとDockerコンテナ起動時に/etc/hostsに自動で追加してくれて、便利です。
最後にvolumes
でプラグインディレクトリを読み込み専用でマウントして完了です。
docker-compose up
するとrake db:migrate
はやってくれますがrake redmine:plugins:migrate
はやってくれないので、以下のようにdocker-compose exec
します。
$ docker-compose up -d redmine-3.2-mariadb
$ docker-compose exec redmine-3.2-mariadb rake redmine:plugins:migrate RAILS_ENV=production
$ docker-compose restart redmine-3.2-mariadb
補足
MariaDBやPostgreSQLはデフォルトでは外部からの接続を受け付けないようになっています。
そこで外部(Redmineの入っているDockerコンテナ)からホストで稼働中のMariaDBやPostgreSQLに接続するための設定をします。
MariaDB
MariaDB 10.1で確認しましたが、MySQLや他のバージョンでも同じだと思います。
以下のようにbind-addressに*
を設定し、ユーザーを作成するときにどこからの接続を受け付けるのかを指定しておきます。
なお bind-address には複数の条件を指定することはできないので、今回のように複数のIPアドレス範囲(localhostとDockerコンテナ内部)から接続する必要があるときは、以下のように*
を指定し、CREATE USER
時にユーザーごとにどこから接続するのかを制限します。
bind-address = *
設定ファイルを書き換えたらMariaDBを再起動しておきます。
CREATE USER 'redmine'@'%' identified by 'passowrd'; -- どこからでも接続できる
CREATE USER 'redmine'@'172.0.0.1/8' identified by 'passowrd'; -- 172.*.*.* から接続できる
PostgreSQL
pg_hba.conf に以下の内容を追記します。
host all all 172.0.0.0/8 md5
Dockerが使いそうなIPアドレスの範囲を書いておきます。
設定ファイルを書き換えたらPostgreSQLを再起動しておきます。
postgresql.confも書き換えておきます。
listen_addresses = '*'