はじめに
本記事は,Docker と Dokcer Compose を使って DB は MySQL で Redmine 6.1.1 を起動する手順である.
https://blog.redmine.jp/articles/6_1/redmine-6_1-docker/ の MySQL 版であり,元記事と同じく,DB パスワードや secret_key_base といった機密情報の取り扱いに Docker Secrets を利用する.
実行環境・使用バージョン
| 項目 | 内容 |
|---|---|
| Redmine | 6.1.1( redmine:6.1.1 ) |
| DB | MySQL 9.6.0( mysql:9.6.0 ).どのバージョンが適切なのかは不明のため,最新バージョンで実行することとした. |
| コンテナ実行 |
Docker version 29.3 + Docker Compose version v5.1.0
|
| 公開ポート |
http://localhost:8080(ホストの8080 → コンテナの3000) |
| 永続化 | Docker volumes(DB / 添付ファイル / プラグイン / テーマ).ホスト上からは /var/lib/dockec/volumes で確認できる |
| 機密情報 | Docker Secrets(ホスト上はファイルで管理) |
その他の前提条件は,元記事と同じく以下の通り.
- Docker Engine と Docker Compose v2 が利用できること(
docker compose versionが動く) -
opensslが利用できること - ホスト側で
8080ポートが空いていること
セットアップ
こちらは 元記事とほぼ同じである.
secrets に利用するファイルのみ,所有グループの変更と権限設定の追加を実施している.
- 作業用ディレクトリの作成する
mkdir redmine
cd redmine
- DB パスワードと Redmine の
secret_key_baseを作成する
openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 24 > db_password.txt
openssl rand -hex 64 > secret_key_base.txt
- Redmine コンテナのユーザが redmine(uid 999) で root のみの読み書きだと実行してくれなかったため,元記事から少し権限を増やして設定する
- ホストには 999 のユーザがいるため,グループに意図しないものが増えて変な感じになる.もっと上手い解決策があるのか不明である
chown root:999 secret_key_base.txt db_password.txt
chmod 600 db_password.txt secret_key_base.txt
Dockerfile 作成
Dockerfile を作成する.
こちらは元記事と完全に同じである.
FROM redmine:6.1.1
USER root
RUN apt-get update && \
apt-get install -y --no-install-recommends \
fonts-noto-cjk \
fontconfig && \
rm -rf /var/lib/apt/lists/* && \
fc-cache -fv
USER redmine
プラグインをインストールする際の注意点(2026/03/21追記)
ネイティブ拡張(Cで書かれたgem)を含むプラグインをインストールする場合は,Dockerfileに build-essential を追加する.
AI helper プラグインをインストールしようとしたところ,エラーが発生したため発覚した.
なるべく軽量なコンテナにする場合は不要である.
FROM redmine:6.1.1
USER root
RUN apt-get update && \
apt-get install -y --no-install-recommends \
fonts-noto-cjk \
fontconfig \
build-essential && \
rm -rf /var/lib/apt/lists/* && \
fc-cache -fv
USER redmine
docker-compose.yml 作成
docker-compose.yml を作成する.
networks:
redmine_network:
driver: bridge
volumes:
mysql_data:
redmine_files:
redmine_plugins:
redmine_themes:
secrets:
db_password:
file: ./db_password.txt
secret_key_base:
file: ./secret_key_base.txt
services:
mysql:
image: mysql:9.6.0
container_name: redmine_mysql
restart: always
networks:
- redmine_network
volumes:
- mysql_data:/var/lib/mysql/
environment:
MYSQL_DATABASE: redmine_production
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
MYSQL_USER: redmine_user
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p$$(cat /run/secrets/db_password)"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
redmine:
build: .
container_name: redmine_app
restart: always
ports:
- "8080:3000"
networks:
- redmine_network
depends_on:
mysql:
condition: service_healthy
volumes:
- redmine_files:/usr/src/redmine/files
- redmine_plugins:/usr/src/redmine/plugins
- redmine_themes:/usr/src/redmine/themes
environment:
REDMINE_DB_MYSQL: mysql
REDMINE_DB_DATABASE: redmine_production
REDMINE_DB_USERNAME: redmine_user
REDMINE_DB_PASSWORD_FILE: /run/secrets/db_password
REDMINE_SECRET_KEY_BASE_FILE: /run/secrets/secret_key_base
TZ: Asia/Tokyo
REDMINE_PLUGINS_MIGRATE: "1"
secrets:
- db_password
- secret_key_base
変更箇所と参考URL
変更箇所についての参考記事と変更理由などを説明する.
原理がどうでも良い人は docker-compose.yml のみをコピーすれば良い.
- MySQL の data 保存場所を変更する
- PostgreSQL は
/var/lib/postgresql/dataだが,MySQL は/var/lib/mysql/に保存される - https://qiita.com/KWS_0901/items/962ff0db367d8ea2473a
- PostgreSQL は
services:
mysql:
volumes:
- mysql_data:/var/lib/mysql/
- MySQL のデータベースや User を設定する
-
MYSQL_ROOT_PASSWORD_FILEは必須となる -
rootではなくredmine_userを使って db にアクセスするので,MYSQL_USERとMYSQL_PASSWORD_FILEを設定する- パスワードは secrets のファイルを読んでくるため,
MYSQL_ROOT_PASSWORD_FILE,MYSQL_PASSWORD_FILEとしている.secrets を使用せず直接パスワードを記載する場合は,MYSQL_ROOT_PASSWORD,MYSQL_PASSWORDとする
- パスワードは secrets のファイルを読んでくるため,
- secrets を使ったパスワードなどの指定方法について https://qiita.com/tarosuke777000/items/0700fc688cf52ffeeeba
- MySQL の各種環境変数について https://qiita.com/tarosuke777000/items/0700fc688cf52ffeeeba
-
services:
mysql:
environment:
MYSQL_DATABASE: redmine_production
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
MYSQL_USER: redmine_user
MYSQL_PASSWORD_FILE: /run/secrets/db_password
- MySQL の healthcheck 方法に変更する
-
mysqladmin ping -h 127.0.0.1 -u root -pPASSWORDで確認できる- パスワードを
catして指定する.-p$$(cat /run/secrets/db_password)
- パスワードを
- healthcheck のコマンドについて https://zenn.dev/sun_asterisk/articles/b4b17681d08018
-
services:
mysql:
healthcheck:
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -u root -p$$(cat /run/secrets/db_password)"]
- Redmine の DB 環境変数を MySQL に変更する
-
REDMINE_DB_MYSQL,REDMINE_DB_POSTGRES, orREDMINE_DB_SQLSERVERがあり,MySQL はREDMINE_DB_MYSQLで指定する - https://hub.docker.com/_/redmine#environment-variables
-
services:
redmine:
environment:
REDMINE_DB_MYSQL: mysql
PostgreSQL から MySQL へデータ移行
先に PostgreSQL で構築したため,練習も兼ねて最初から立ち上げるのではなく移行した.
最初から MySQL で構築した人は,実施不要である.
https://blog.redmine.jp/articles/change-database/
- Redmine コンテナに接続(元記事の docker-compose.yml を使用)
docker compose up -d
- PostgreSQL のバックアップ
-
yaml_dbをインストールして,dumpを取り,ローカルに退避する
-
docker compose exec -it redmine bash
$ pwd
/usr/src/redmine
$ echo gem \'yaml_db\' >> Gemfile
$ bundle install
$ export REDMINE_DB_PASSWORD="$(cat /run/secrets/db_password)"
$ export SECRET_KEY_BASE="$(cat /run/secrets/secret_key_base)"
$ env RAILS_ENV=production rake db:dump
$ ls db/
data.yml migrate/ schema.rb
$ exit
docker compose cp redmine_app:/usr/src/redmine/db/data.yml ./tmp/data.yml
- MySQL へ DB 変更(本記事の docker-compose.yml を使用)
- 起動し直して MySQL へ諸々変更された後に,dump した転送する
docker compose down
docker compose up -d
docker compose cp ./tmp/data.yml redmine:/usr/src/redmine/db/data.yml
docker compose exec -it redmine bash
- MySQL へロード
- 一度コンテナが削除されているので
yaml_dbを入れ直してからロードする -
DISABLE_DATABASE_ENVIRONMENT_CHECK=1について https://qiita.com/Esfahan/items/75ade0233fe02ab04381
- 一度コンテナが削除されているので
$ pwd
/usr/src/redmine
$ echo gem \'yaml_db\' >> Gemfile
$ bundle install
$ export REDMINE_DB_PASSWORD="$(cat /run/secrets/db_password)"
$ export SECRET_KEY_BASE="$(cat /run/secrets/secret_key_base)"
$ DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:load RAILS_ENV=production