LoginSignup
6
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-07

自分が普段使うディストリビューション向けのコンパイル済みのバイナリを欲しいときがあります.
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してたら直りました.

6
5
0

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
6
5