[Docker] AlpineベースのRubyコンテナにMySQLとGemをインストールする

Dockerで軽量なAlpine LinuxベースのRubyコンテナにMysql Gemをインストールしようとしたら、いろいろハマったので対策をメモとして残します。

Dockerfile (成功例)

こちらの例で成功しました。

GemfileはDockerfileと同じディレクトリにある前提です。

FROM ruby:2.4.0-alpine

RUN apk --no-cache add build-base mariadb-dev

RUN mkdir /app
WORKDIR /app

ADD Gemfile /app
RUN bundle install

Dockerfile (失敗例)

FROM ruby:2.4.0-alpine

RUN apk --no-cache add mysql-dev

RUN mkdir /app
WORKDIR /app

ADD Gemfile /app
RUN bundle install

build-baseがないとGemの作成で失敗する

build-baseがない状態だと、Mysql2 Gemをビルドする際に下記のエラーが出ました。

/usr/local/lib/ruby/2.4.0/mkmf.rb:457: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.4.0/mkmf.rb:542:in `try_link0'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:557:in `try_link'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:768:in `try_func'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:1055:in `block in have_func'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:945:in `block in checking_for'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:351:in `block (2 levels) in postpone'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:321:in `open'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:351:in `block in postpone'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:321:in `open'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:347:in `postpone'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:944:in `checking_for'
    from /usr/local/lib/ruby/2.4.0/mkmf.rb:1054:in `have_func'
    from extconf.rb:25:in `<main>'

build-baseを追加すればOKでした。

mysql-devでもmariadbがインストールされる

ネットで探していると、「mysql-devじゃなくてmariadb-devをインストールするといい」という情報が出てきますが、2019年2月現在では、mysql-devを指定しても、自動的にmariadb-devがインストールされました。