はじめに
Gitbucketの組み込みDBであるH2Database
はたまに壊れる事があるとのことで、ちゃんと運用するにはMySQLかPostgreSQLサーバを建てた方がよいとのこと。
GitbucketもMySQLも公式Dockerイメージから構築しようとした時に、ややハマった部分と対応作を備忘録する。
結論
一端、これでうまいこといっているので、良しとする。
# Docker-Composeのバージョンが低いのは、Portainerがまだバージョン2までしか対応していないため。特に意味はない
version: '2'
services:
#MySQLの設定
mysql:
image: mysql
container_name: gitbucket_mysql
ports:
- 3306:3306
- 33060:33060
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: gitbucket
MYSQL_USER: gitbucket
MYSQL_PASSWORD: gitbucket
volumes:
- mysql:/var/lib/mysql
# ポイント1 キャラクタセットの設定、ポイント2 認証プラグインの変更
command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]
gitbucket:
image: gitbucket/gitbucket
container_name: gitbucket
depends_on:
- mysql
ports:
- 8080:8080
environment:
GITBUCKET_DB_URL: jdbc:mysql://gitbucket_mysql:3306/gitbucket?useUnicode=true&characterEncoding=utf8
GITBUCKET_DB_USER: gitbucket
GITBUCKET_DB_PASSWORD: gitbucket
volumes:
- gitbucket:/gitbucket
# ポイント3 MySQLが立ち上がるのをちょっとだけ待つ
command: ["sh", "-c", "sleep 10 && java -jar /opt/gitbucket.war"]
volumes:
mysql:
driver_opts:
type: none
device: /PATH/TO/MOUNT/DIR/mysql
o: bind
gitbucket:
driver_opts:
type: none
device: /PATH/TO/MOUNT/DIR/gitbucket
o: bind
ポイント1 MySQL キャラクタセットの指定
command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]
別にはまったわけではないが、MySQLのサーバ側のキャラセットを設定ファイル(my.cnf
)なしで変更したかったので、起動パラメータでUTF8に指定した。
ポイント2 MySQL 認証プラグインの変更
command: ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]
MySQL8以降、標準の認証方式がRSA認証になったようなので、旧式のパスワード認証に変更する。新式の認証方法はGitbucket側が対応していなければならないが、現段階でWikiを見る限りまだ未対応?の模様。(ただ、ブログを見る限りMySQL8対応をされているようだが)
ポイント3 Gitbucket起動時にウェイトタイム設ける
command: ["sh", "-c", "sleep 10 && java -jar /opt/gitbucket.war"]
これが、一番はまった。
MySQLの初回立ち上がり時、まだデータベースがないので起動後すぐには接続できない。Docker-Composeで立ち上げるとGitbucket起動後もまだMySQLが準備中の段階。そのため、Gitbucket側で接続エラーになってしまう。
MySQLのDockerHubのDescribeにも記載されているが、こういった場合はシェルなどで接続リトライをするようにしている。
ちょっとダサいのはやむを得ないが、接続リトライとか面倒なので、てっとり早くウェイトタイム10秒をいれた。(10秒もいらんかも)