Alpine LinuxベースのDockerでRails5.1を動かす

More than 1 year has passed since last update.

以前DockerでRails5.1&React.js&es6な環境を構築するというのを書いたけど、これだとRubyがおデブちゃんなせいで簡単に800MB超えする。開発が進んでいくと更に酷いことになる。

なので、Alpine Linuxベースで作ることでダイエットを図ろうという魂胆。


Dockerfileを書き換える

元々の記事だとだいたいこんな感じに書いていた。(関係ない所は端折ってます)


Dockerfile

FROM ruby:2.4.1

LABEL maintainer 'kazuya Hara <kazuya@example.com>'

ENV LANG C.UTF-8
ENV ROOT_PATH /appname

RUN apt-get update -qq && apt-get install -y build-essential libpq-dev

RUN mkdir $ROOT_PATH
WORKDIR $ROOT_PATH

ADD Gemfile $ROOT_PATH/Gemfile
ADD Gemfile.lock $ROOT_PATH/Gemfile.lock
RUN bundle install

ADD . $ROOT_PATH


これを以下の通りに書き換える。


Dockerfile

FROM ruby:2.4.1-alpine

LABEL maintainer 'kazuya Hara <kazuya@example.com>'

ENV LANG C.UTF-8
ENV ROOT_PATH /appname

RUN mkdir $ROOT_PATH
WORKDIR $ROOT_PATH
ADD Gemfile $ROOT_PATH/Gemfile
ADD Gemfile.lock $ROOT_PATH/Gemfile.lock

RUN apk update && \
apk upgrade && \
apk add --update --no-cache --virtual=.build-dependencies \
build-base \
curl-dev \
linux-headers \
libxml2-dev \
libxslt-dev \
postgresql-dev \
ruby-dev \
yaml-dev \
zlib-dev && \
apk add --update --no-cache \
bash \
git \
openssh \
postgresql \
ruby-json \
tzdata \
yaml && \
bundle install -j4 && \
apk del .build-dependencies

ADD . $ROOT_PATH



解説


ruby2.4.1-alpineを使っている

見た通りだけど、alpine版を指定してます。指定するかしないかで、ruby部分でこれくらいサイズが違ってきます。

REPOSITORY              TAG                 SIZE

ruby 2.4.1-alpine 61.5MB
ruby 2.4.1 679MB

なんと1/10になる。


apt-getのかわりにapkを使う

apkはAlpineで使えるパッケージマネージャ。apt-getは使えない。


--no-cache--virtualのオプション

--no-cacheはその名の通りキャッシュしないためのオプションで、不要なゴミがイメージに残るのを防ぐ。--virtualは、後に続くやつら(上記で言えばbuild-baseからzlib-dev)をグルーピングする。事前に.build-dependenciesとグルーピングしておいて、最後にapk del .build-dependenciesで纏めて削除している。

Alpineは無駄なものがかなり削ぎ落とされているので、使いたいGemによっては追加でapk addしてあげる必要が出てくる。適宜お好きなものを足したり引いたりして下さい。