Dockerで複数バージョンのrubyがインストールされたイメージを作る

tcnksm/docker-rbenv

これにより,rbenvにより複数バージョンのrubyがインストールされたイメージをつくることができる.

イメージはdocker.ioに置いてある(tcnksm/rbenv)ためすぐに使うことができる.

$ docker pull tcnksm/rbenv

もしくはDockerfileで

FROM tcnksm/rbenv

とするだけ.

具体的な使い方は,Dockerで継続的インテグレーションに書いた.例えば,guardと連携して,複数バージョンに対するrspecテストをローカルで実現するなど.

Dockerfile

以下では,このイメージを作成するためのDockerfileの詳細な説明とオリジナルのイメージを作成する方法について書く.Dockerfileは以下.

FROM base

MAINTAINER tcnksm "https://github.com/tcnksm"

# Install packages for building ruby
RUN apt-get update
RUN apt-get install -y --force-yes build-essential curl git
RUN apt-get install -y --force-yes zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev
RUN apt-get clean

# Install rbenv and ruby-build
RUN git clone https://github.com/sstephenson/rbenv.git /root/.rbenv
RUN git clone https://github.com/sstephenson/ruby-build.git /root/.rbenv/plugins/ruby-build
RUN ./root/.rbenv/plugins/ruby-build/install.sh
ENV PATH /root/.rbenv/bin:$PATH
RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh # or /etc/profile

# Install multiple versions of ruby
ENV CONFIGURE_OPTS --disable-install-doc
ADD ./versions.txt /root/versions.txt
RUN xargs -L 1 rbenv install < /root/versions.txt

# Install Bundler for each version of ruby
RUN echo 'gem: --no-rdoc --no-ri' >> /.gemrc
RUN bash -l -c 'for v in $(cat /root/versions.txt); do rbenv global $v; gem install bundler; done'

基本的には普段rbenvとruby-buildによるインストールと同じことをしている.つまり,

  1. ベースイメージを持ってくる(FROM base)
  2. rubyのビルドに必要なパッケージのインストール(RUN apt-get ...)
  3. rbenvのダウンロード
  4. ruby-buildのダウンロード
  5. rbenvの環境変数を設定(ENV PATH /root/.rbenv/bin:$PATH)
  6. ログインコマンドの設定(RUN echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh)
  7. インストールしたいrubyのバージョンを記述したversions.txtをイメージ内に配置
  8. versions.txtに記載されたバージョンをrbenv installでインストール
  9. versions.txtに記載されたバージョンごとにbundlerをインストール

別のバージョンがインストールされたイメージを作りたい場合はverions.txtを編集するだけ.

さらに,Gemfileをもとに基本的なrubygemsをインストールしたい場合はDockerfileを以下のようにする.

ADD ./Gemfile /root/Gemfile
RUN bash -l -c 'cd /root/; for v in $(cat rubies.txt); do rbenv global $v; bundle install; done'

イメージの作成は以下のコマンドで行う.

docker build -t USERNAME/IMAGENAME .

docker.ioに上げたい場合は以下を実行する.

docker login
docker push USERNAME/IMAGENAME 

参考