CentOSベースのRubyコンテナイメージを作成する
Rubyがインストールされたコンテナイメージが欲しかったのでメモ。
背景
そもそもRubyのコンテナイメージはDocker公式が配布している。
DockerHub
しかし、これらのイメージはベースがDebianやAlpine Linux、Ubuntuとなっている。 とある理由でCentOSがベースのRubyコンテナが欲しかったので自分でビルドすることにした。
Dockerfile
コンテナでない環境なら普段はrbenvとruby-buildを使ってRubyをインストールするのだが、コンテナではRubyをひとつしか入れないのでrbenvは不要。
コンテナにはできるだけ余計なものを入れたくないため、はじめは自分でRubyをビルドしようとしたのだが、思いのほか複雑になってしまう。
よい方法がないかしばらく調べた結果、ruby-buildを単独で使えばよいことがわかった。
(というかruby-buildはrbenvと一緒に使うものという認識だったので、それ単独で使えるとは思っていなかった)
よくよく見てみるとReadmeに普通に書いてある。
rbenv/ruby-build: Compile and install Ruby
Dockerfileは以下のようになる。
FROM centos:7
RUN yum install -y git make gcc bzip2 openssl-devel libyaml-devel libffi-devel readline-devel zlib-devel gdbm-devel ncurses-devel && \
git clone https://github.com/rbenv/ruby-build.git && \
PREFIX=/usr/local ./ruby-build/install.sh
ENV GEM_HOME=/tmp/gems
VOLUME ${GEM_HOME}
ENV RUBY_VERSION=2.7.3
ENV RUBY_DIR=/usr/local/ruby-${RUBY_VERSION}
RUN /usr/local/bin/ruby-build ${RUBY_VERSION} ${RUBY_DIR}
ENV PATH=/tmp/gems/bin:${RUBY_DIR}/bin:${PATH}
CMD irb
以下のように設計してある。
- コマンドを与えない場合、irbが起動するようにしている
- Gemはコンテナ内の
/tmp/gems
へインストールされる - このディレクトリをホストへ外出しすることで、コンテナを作り直してもGemを保持できる
おそらくruby-buildやビルドのためにインストールしたパッケージはRubyを動かすこと自体には不要なので、 Multi stage buildを使えばイメージサイズをもっと小さくできそう。それはまたの機会に実施することにする。
これを書いたあとにCentOSプロジェクトがCentOS 7ベースのRubyコンテナをいくつか公開していることに気づいてしまった……。
OpenShiftのS2Iビルド用のイメージだが、おそらくそれ以外の用途にも使えそう。
centos/ruby-27-centos7
とはいえパッチバージョンまで指定したい場合は自作するしかなさそう。
追記
Multi stage buildを使ってDockerfileを書き直した。
ついでにRubyのバージョンをBuild argにすることでビルド時に外部から与えることができるように変更。
イメージのサイズは140MBほど減って391MBになった。
関連記事
- WSL2にPodmanを入れる
- Raspberry Pi 4BにKubernetesをインストール(2021年版)
- FactoryBotでテストのはじめにデータを用意する
- RSpecでFakerを使うならKernel.srandを設定しておけという話
- Ruby on RailsのAsset Pipelineとインクルードとプリコンパイルの動作