LoginSignup
10
11

More than 5 years have passed since last update.

gollumをAlpine LinuxでDocker化

Last updated at Posted at 2016-04-30

最近勉強したことをメモするのにgollumを使っていたのだけど、いまどきCentOS7に何も考えずこれを動かしておくのも勿体無いなと思い、Alpine LinuxでDockerコンテナ化してCoreOSで動かすことにした。Alpine Linuxは当方初挑戦である。今回の成果はGitHubにも上げました。

chroju/docker_gollum: gollum on docker (Alpine Linux)

gollum ?

Github Wikiだけを切り出して汎用的に使えるようにしたもの、といった位置づけらしい。特徴としてはMarkdownやReSTといった複数の書式が使えるという点、出力がGithub Wikiを元としているのでかなり見慣れたスッキリした見た目になる点など。Gemで提供しているので取り回しがしやすい点も重宝する。

インフラ環境の選択

ホスト

Dockerコンテナを置く環境としては、さくらクラウドのCoreOSを使うことにした。理由は単純にクーポンを持ってるからなのだけど、1台自由に使えるDockerホストは欲しいと思ってた。検証環境としては大変便利だと思うので。

クラウドなので何も考えずに使えるのは使えるんだけど、一点だけ注意点としてはCoreOSのバージョンが最新とは限らないようなので、起動後に一度以下コマンドを実行して手動でバージョンを上げておく必要がある。自分の場合はdocker pullが正しく動かなかった。

$ sudo update_engine_client -update

コンテナ

時代の潮流に乗ってAlpine Linux。 正直言って必要な部分だけしか学べてないので、これ以降書いていることと異なるベストプラクティスがあるかもしれない。 Docker用軽量OSということで簡単に使おうと思ってたけど、OSはOSなので時間作ってもうちょい掘り下げたいところ。

※2016-05-02 CMDを修正。crondが後ろだと動かないことに気付いた。

Dockerfile

取りあえず完成版を貼る。

FROM ruby:alpine
MAINTAINER chroju

WORKDIR /root

ADD files/id_rsa /root/.ssh/id_rsa
RUN apk --update --no-cache add git g++ ruby-dev linux-headers icu-dev libxml2-dev libxslt-dev build-base openssh && \
ssh-keyscan -t rsa github.com > ~/.ssh/known_hosts && \
gem install gollum github-markdown redcarpet org-ruby --no-ri --no-doc -- --use-system-libraries && \
git config --global user.email "chor.chroju@gmail.com" && git config --global user.name "chroju" && \
git clone git@github.com:chroju/gollum_articles /root/gollum && \
touch /etc/periodic/hourly/gitpush && \
echo -e "#!/bin/sh\ncd /root/gollum && git push origin master" >> /etc/periodic/hourly/gitpush && \
chmod a+x /etc/periodic/hourly/gitpush

ADD files/auth.rb /root/gollum/auth.rb

CMD crond && /usr/local/bundle/bin/gollum /root/gollum --config /root/gollum/auth.rb

EXPOSE 4567

Dockerfile、現状RUN&&で複数コマンド書き連ねるみたいのがベストプラクティスになってて、仕様がなんだかイケてない気がする……ってのはここでは置いておいて。やっていることはそれほど多くないとは思う。Alpine LinuxのイメージはRubyが入ったものがあったので、Gemであるgollum動かす上で選定した。

apk add

Alpine Linuxのパッケージ管理はapkを使う。--updateでパッケージリストをアップデートし、--no-cacheでキャッシュを捨ててイメージを小さく保つ。入れているのはgollumで必要なものとgitコマンドを使うためのopensshだが、不要なものもちょっと入ってるかも。

ssh-keyscan

gollumで書いた記事のバックアップとして、コンテナからGitHubへやり取りさせようとしていたのだが、これが何故かHost key verification failed.になってしまった。ググったらちょうどいいstack overflowが出たのでそのまま解消策として採用してるけど、具体的になぜこれが対策になるかはまだ調べてない。

docker - Dockerfile Cannot access GIT repo with my private key - Stack Overflow

GitHubでの記事保存

gollumで書いた記事はそのままだとコンテナの停止と共に消えてしまうので、先述の通りGitHub上に保存している。本来であればCoreOS上でレポジトリを持っておき、Dockerにマウントさせる形を取りたかったのだが、どうもそれだとgollumが正常に動作しないので諦めた。現状はgollumの記事を保存しているGitHubレポジトリをRUNの段階でgit cloneし、コンテナの起動後はcronで定期的にgit pushさせるようにしている。

Alpine Linuxにおけるcron

Alpine Linuxのcronについては、OfficialnのWikiを探したら次の場所に記載があった。

Alpine Linux:FAQ - Alpine Linux

/etc/periodic配下に15minhourlydailyといったフォルダがあるので、必要とする間隔のフォルダ内に実行可能ファイルを置けばよい。なお、ファイルは拡張子を省く必要があるので、.shは不要。

また上記FAQ内にはcrondが自動起動されるかのような記述があるが、自分の環境では起動しなかった(Dockerコンテナ上のAlpineだとダメなのかも?)ので、明示的にCMDで起動する必要がある。

gollumの認証

gollumはデフォルトだと認証機構を持たないので、簡単な認証を設ける。

auth.rb
module Precious
  class App < Sinatra::Base
    use Rack::Auth::Basic, "Restricted Area" do |username, password|
      [username, password] == ["chroju", "xxxx"]
    end
  end
end

このファイルをgollumのディレクトリに置き、gollum実行時に--configオプションで渡すと認証が有効になる。この構成ではgollumディレクトリはgit pushすることにしているので、.gitignoreでauth.rbを無視させることを忘れずに。

docker run

必要なコマンドはすべてDockerfileのCMDに入れ込んだので、実行時はシンプルにポートフォワーディングだけ設定すればOK。

$ docker run -d -p 4567:4567 gollum:latest
10
11
2

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
10
11