Help us understand the problem. What is going on with this article?

Dockerを使って新鮮なバイナリを作る

More than 3 years have passed since last update.

自分が普段使うディストリビューション向けのコンパイル済みのバイナリを欲しいときがあります.
Rubyをrbenvなどでコンパイルしてインストールしているとかfffmpegとかimagemagickとかのディストリビューション標準のリポジトリから入るものを使いたくない場合などです.こういったときにJenkinsを使えばいいという方がいるかもしれませんが,バージョンを固定するのが難しかったり依存関係を全て追うのが困難だったりと色々悩みがあります.依存関係に悩まされないまっさらな環境が欲しいです.
こういうときにはVagrantを使う手もありますが,VirtualBoxはかなり遅いので気軽に使えません.もっとサクッとやりたいです.

ということでDockerを使います.

今回やること

rbenvとruby-buildでRubyをコンパイルしてそのコンパイル結果をtarで固めてみます.
以下のやり方はこれ以外の用途にも色々使えると思います(テストとか).

やること

まず最新のDebianのDockerのイメージを手に入れます.やり方は以下に書きました.

DockerでDebianを使いたい - Qiita

これで作ったDockerのイメージをベースにしてDockerfileを作ります.

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してたら直りました.

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away