自分が普段使うディストリビューション向けのコンパイル済みのバイナリを欲しいときがあります.
Rubyをrbenvなどでコンパイルしてインストールしているとかfffmpegとかimagemagickとかのディストリビューション標準のリポジトリから入るものを使いたくない場合などです.こういったときにJenkinsを使えばいいという方がいるかもしれませんが,バージョンを固定するのが難しかったり依存関係を全て追うのが困難だったりと色々悩みがあります.依存関係に悩まされないまっさらな環境が欲しいです.
こういうときにはVagrantを使う手もありますが,VirtualBoxはかなり遅いので気軽に使えません.もっとサクッとやりたいです.
ということでDockerを使います.
今回やること
rbenvとruby-buildでRubyをコンパイルしてそのコンパイル結果をtarで固めてみます.
以下のやり方はこれ以外の用途にも色々使えると思います(テストとか).
やること
まず最新のDebianのDockerのイメージを手に入れます.やり方は以下に書きました.
これで作ったDockerのイメージをベースにしてDockerfileを作ります.
FROM catatsuy/wheezy
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get upgrade -y && apt-get clean && rm -rf /var/cache/apt/archives/* && \
apt-get install -y --no-install-recommends \
ca-certificates \
git \
build-essential \
curl \
libssl-dev \
libffi-dev \
libreadline5 \
libreadline-gplv2-dev \
zlib1g \
zlib1g-dev && \
rm -rf /var/lib/apt/lists/*
ENV RBENV_ROOT="/usr/local/rbenv"
RUN git clone git://github.com/sstephenson/ruby-build.git /usr/local/src/ruby-build && \
cd /usr/local/src/ruby-build && \
./install.sh
これで docker build -t rbenv --no-cache .
とやればRubyのコンパイルに必要なパッケージがインストールされているDockerイメージを作ることができます.これを使ってお目当てのRubyをコンパイルしてみます.
docker run \
--name ruby_build \
-v "/tmp/rbenv:/usr/local/rbenv" \
rbenv \
sh -c "git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv; mkdir -p /usr/local/rbenv/shims; mkdir -p /usr/local/rbenv/versions; CONFIGURE_OPTS='--disable-install-rdoc' /usr/local/rbenv/bin/rbenv install ${TARGET_VER} -v; /usr/local/rbenv/bin/rbenv rehash"
docker run でディレクトリをマウントした上でコンパイルするためのコマンドを実行するだけです.こうすればコンパイル済みのバイナリが手に入ります.
Jenkinsを使っているならあとはこれを成果物としてダウンロードできるようにするだけです.
注意点
Dockerが出力するコンパイル済みのバイナリなどはファイルの所有者がroot:rootになるので削除とかが難しいです.
それとこれをやっている最中に突然Dockerコンテナが外部に通信できなくなりました.docker rm $(docker ps -a -q)
してコンテナのプロセスを全部殺してもダメで,何回かsudo service docker restart
してたら直りました.