公式のAlpineのRubyイメージに、nokogiriをインストールをエラーになるので、それの対応方法。

デフォルトの状態だとエラーになる

まずは、コンテナの起動。

$ docker run -it ruby:alpine /bin/sh

起動後、nokogiri をインストールしようとするとエラーになる。

# gem install nokogiri
Fetching: mini_portile2-2.0.0.gem (100%)
Successfully installed mini_portile2-2.0.0
Fetching: nokogiri-1.6.7.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
  ERROR: Failed to build gem native extension.

    current directory: /usr/local/bundle/gems/nokogiri-1.6.7.2/ext/nokogiri
/usr/local/bin/ruby -r ./siteconf20160320-5-1grlmdx.rb extconf.rb
checking if the C compiler accepts ... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
  --with-opt-dir
  --without-opt-dir
  --with-opt-include
  --without-opt-include=${opt-dir}/include
  --with-opt-lib
  --without-opt-lib=${opt-dir}/lib
  --with-make-prog
  --without-make-prog
  --srcdir=.
  --curdir
  --ruby=/usr/local/bin/$(RUBY_BASE_NAME)
  --help
  --clean
/usr/local/lib/ruby/2.3.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
  from /usr/local/lib/ruby/2.3.0/mkmf.rb:571:in `block in try_compile'
  from /usr/local/lib/ruby/2.3.0/mkmf.rb:522:in `with_werror'
  from /usr/local/lib/ruby/2.3.0/mkmf.rb:571:in `try_compile'
  from extconf.rb:80:in `nokogiri_try_compile'
  from extconf.rb:87:in `block in add_cflags'
  from /usr/local/lib/ruby/2.3.0/mkmf.rb:629:in `with_cflags'
  from extconf.rb:86:in `add_cflags'
  from extconf.rb:336:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /usr/local/bundle/extensions/x86_64-linux/2.3.0-static/nokogiri-1.6.7.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /usr/local/bundle/gems/nokogiri-1.6.7.2 for inspection.
Results logged to /usr/local/bundle/extensions/x86_64-linux/2.3.0-static/nokogiri-1.6.7.2/gem_make.out

エラーの対応方法

関連パッケージのインストール

必要になるものは、下記3つのパッケージ。

  • build-base
  • libxml2-dev
  • libxslt-dev

パッケージをインストールする。

# apk add --no-cache build-base libxml2-dev libxslt-dev
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
(1/17) Installing binutils-libs (2.25.1-r0)
(2/17) Installing binutils (2.25.1-r0)
(3/17) Installing gmp (6.1.0-r0)
(4/17) Installing isl (0.14.1-r0)
(5/17) Installing libgomp (5.3.0-r0)
(6/17) Installing libatomic (5.3.0-r0)
(7/17) Installing libgcc (5.3.0-r0)
(8/17) Installing mpfr3 (3.1.2-r0)
(9/17) Installing mpc1 (1.0.3-r0)
(10/17) Installing libstdc++ (5.3.0-r0)
(11/17) Installing gcc (5.3.0-r0)
(12/17) Installing make (4.1-r0)
(13/17) Installing musl-dev (1.1.12-r2)
(14/17) Installing libc-dev (0.7-r0)
(15/17) Installing fortify-headers (0.7-r0)
(16/17) Installing g++ (5.3.0-r0)
(17/17) Installing build-base (0.4-r1)
Executing busybox-1.24.1-r7.trigger
OK: 178 MiB in 55 packages

ただ、インストールしても、nokogiriのインストールはエラーになる。

gem install オプションの変更

gemのオプションを指定してインストールを実行。

# gem install nokogiri \
>     -- --use-system-libraries \
>     --with-xml2-config=/usr/bin/xml2-config \
>     --with-xslt-config=/usr/bin/xslt-config
Building native extensions with: '--use-system-libraries --with-xml2-config=/usr/bin/xml2-config --with-xslt-config=/usr/bin/xslt-config'
This could take a while...
Successfully installed nokogiri-1.6.7.2
1 gem installed

エラーなく、nokogiriのインストールできました。

おまけ

Dockerfile を用意したので、参考になれば。

FROM ruby:alpine
MAINTAINER mizu <mizu.copo@gmail.com>

RUN set -x \
  && apk upgrade --no-cache \ 
  && apk add --no-cache --virtual build-dependencies \
    build-base \
  && apk add --no-cache \
    libxml2-dev \
    libxslt-dev \
  && gem install nokogiri \
    -- --use-system-libraries \
    --with-xml2-config=/usr/bin/xml2-config \
    --with-xslt-config=/usr/bin/xslt-config \
  && apk del build-dependencies