以前DockerでRails5.1&React.js&es6な環境を構築するというのを書いたけど、これだとRubyがおデブちゃんなせいで簡単に800MB超えする。開発が進んでいくと更に酷いことになる。
なので、Alpine Linuxベースで作ることでダイエットを図ろうという魂胆。
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
これを以下の通りに書き換える。
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
してあげる必要が出てくる。適宜お好きなものを足したり引いたりして下さい。