Redmineの公式Dockerイメージを例に、自分に合ったDockerの使い方を探る
Posted on 2016/11/20(Sun) 01:05 in technical
はじめに
Dockerは非常に簡単にアプリケーションをデプロイすることができて、環境に対する悩みをかなりの割合で解消してくれる。
とはいえ、イメージを公開してくれている人には非常に申し訳ないのだけど、自分で作ったイメージか公式(≒開発元が提供している)イメージ以外の公開イメージを使うのは、それはそれで気が引けてしまう。
などと及び腰なことを考えていると、プラグインや設定の追加変更を目前に、やはり単に起動するだけでは思い通りにならないという悩みを抱えることになる。
今回は Redmineの公式コンテナイメージ を例に、Docker利用上の作法を探ってみる。
警告
大体は redmine の公式コンテナイメージの使い方に終始します。
環境
環境については、以下の通り。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS" $ docker -v Docker version 1.12.1, build 23cf638 $ docker-compose -v docker-compose version 1.8.1, build 878cff1
また、一般ユーザーが Docker グループに所属しているという前提で進行する。
Redmineを起動する
Redmine公式のドキュメント によれば、SQLite3、PostgreSQL、MySQL(MariaDB)が使えるらしいので、今回はMariaDBを使用することにする。
まずは、以下のような docker-compose.yml を作成した。
version: '2' services: redmine: image: redmine:3.2 ports: - 3000:3000 environment: REDMINE_DB_MYSQL: db REDMINE_DB_PASSWORD: password depends_on: - db restart: always db: image: mariadb:10.0 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: redmine restart: always volumes: - ./mysql_conf.d:/etc/mysql/conf.d/ - ./mysql_data:/var/lib/mysql
そして起動する。
$ docker-compose up -d
これで、 http://localhost:3000 にでもアクセスすればRedmineの画面とご対面だ。
それにしても手軽だなぁ。
メールの設定追加
さて Username: admin / Password: admin でログインしてRedmineの管理画面に辿り着いた僕は、メールの設定をしないといけないことに気付いた。
config/configuration.yml を編集するように言われるので、公式コンテナイメージではどうなっているか見てみると、こんな感じだった。
$ docker exec -it redmine_redmine_1 ls -l config total 75 -rw-rw-r-- 1 redmine redmine 219 Oct 10 07:50 additional_environment.rb.example -rw-rw-r-- 1 redmine redmine 3490 Oct 10 07:50 application.rb -rw-rw-r-- 1 redmine redmine 171 Oct 10 07:50 boot.rb -rw-rw-r-- 1 redmine redmine 8140 Oct 10 07:50 configuration.yml.example -rw-r--r-- 1 root root 132 Nov 19 14:39 database.yml -rw-rw-r-- 1 redmine redmine 1137 Oct 10 07:50 database.yml.example -rw-rw-r-- 1 redmine redmine 586 Oct 10 07:50 environment.rb drwxrwxr-x 2 redmine redmine 4096 Oct 10 07:50 environments drwxrwxr-x 2 redmine redmine 4096 Nov 19 14:39 initializers drwxrwxr-x 2 redmine redmine 4096 Oct 10 07:50 locales -rw-rw-r-- 1 redmine redmine 17323 Oct 10 07:50 routes.rb -rw-rw-r-- 1 redmine redmine 5526 Oct 10 07:50 settings.yml
つまり設定ファイルを書いて送り込めばいい。
まずは configuration.yml.example に倣って、以下のように configuration.yml を書いてみる。(ここではGmailを例にしてみる)
default: email_delivery: delivery_method: :smtp smtp_settings: enable_starttls_auto: true address: "smtp.gmail.com" port: 587 domain: "example.com" # 'your.domain.com' for GoogleApps authentication: :login user_name: "redmine@example.com" password: "password"
dockerにはホストからコンテナ内にファイルコピーが可能なので、上記ファイルをコピーして、サービスを再起動する。
$ docker cp configuration.yml redmine_redmine_1:/usr/src/redmine/config/configuration.yml $ docker-compose restart
これを手間と見るかどうかは人による気がする。
確かにメール位は docker-compose で environment に設定できた方が良いかもね。
environment で設定できそうかどうかは docker inspect redmine:3.2 のようにして確認できるので、初めて触れるイメージにはとりあえず叩いてみるのも良さそうだ。
テーマの追加
Redmineのテーマを変えたい場合はどうしよう。
場所はここ。
$ docker exec -it redmine_redmine_1 ls -l public/themes total 10 -rw-rw-r-- 1 redmine redmine 30 Oct 10 07:50 README drwxrwxr-x 3 redmine redmine 4096 Oct 10 07:50 alternate drwxrwxr-x 4 redmine redmine 4096 Oct 10 07:50 classic
やっぱりボリュームマウントによる対応かな?
ボリュームマウントすると通常のマウントと同じように、元々入ってるthemesが見えなくなる。
元々入ってるテーマもとりあえず残しておきたいので、今回は追加コマンドを叩く方式を採用する。
ファイルを置いてコンテナを再起動するだけ。
こんな感じ。 gitmike をお借りした。
$ docker exec -it redmine_redmine_1 sh -c 'git clone git://github.com/makotokw/redmine-theme-gitmike.git public/themes/gitmike' $ docker-compose restart
ふむ、簡単。
プラグインの追加
プラグインの追加はもう少し悩むべきだったかもしれない。
確かに bundle install とか叩かないといけない場合はコマンドが2,3行になるのだけど、よく考えたら Dockerfile もRUNコマンドが長かったな、と考えたのがまずかった。
テーマの追加と同じように、外からコマンド叩けばいいや、と思考停止した僕はプラグインの追加についても左程悩まなくなってしまった。
例えば、ナレッジベースを追加するプラグインの場合は、
$ docker exec -it redmine_redmine_1 sh -c ' git clone git://github.com/alexbevi/redmine_knowledgebase.git plugins/redmine_knowledgebase && bundle install && rake redmine:plugins:migrate NAME=redmine_knowledgebase'
のように実行できる。
docker exec する場合は、どこがコマンドの終端か分かりにくいので sh -c '<command>' する方が良さそうだな、と言うくらい。
後は同じようにコンテナを再起動する。
$ docker-compose restart
おわり
アプリケーションデプロイの方法にDockerを使う、と言うものが追加されたことによって、公式コンテナイメージを使うのと、自分用に変数化する部分とインストール手順を決めてコンテナイメージを作るのと、どちらが良いかについて悩むことになった。
リスク的な面で、とりあえず公式コンテナイメージを使うポリシーで動こうと決めたものの、ではそのカスタマイズは、と言うのが今回の話。
今回ネタにしたように、公式コンテナイメージにもう少し手を加えたいとなれば、それはコンテナ自体をデプロイするAnsibleの役目なんじゃないかなーと思うので、僕としては役割分担についてもある程度納得できた。
最初からプラグインもテーマもてんこ盛りにした誰かが作ったコンテナイメージでも、動くならそれを使って、本来やるべきことに注力したい人もいるのかもしれない。
まぁ、その辺りは面倒を見る期間とか立場とか興味とか、色々あるだろうね。
僕の場合は「本来やるべきこと」が環境作りに偏っているので、だいぶ保守的な使い方に落ち着きそう。
いったんここまで。