RailsのDockerベースイメージをalpineに変更する【image size比較】

2022/02/08に公開

記事の内容

Rails用のDockerifleのベースイメージをalpineに変更する

対象読者

  • alpineでRails開発環境を作成したい人

環境

  • mac OS
  • Rails 6
  • ruby 3.1
  • MySQL 5.7

Rails開発環境の作り方

https://zenn.dev/ring_belle/articles/e6412a7b6557d5

この記事にて、Rails + MySQLのDocker開発環境の作り方は解説済み

Dockerfile

alpine変更前

FROM ruby:3.1.0
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn
WORKDIR /myapp
COPY Gemfile* /myapp/
RUN bundle install -j4

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

alpine変更後

FROM ruby:3.1.0-alpine3.15

WORKDIR /myapp
COPY Gemfile* /myapp/

RUN apk update && \
    apk upgrade && \
    apk add --no-cache linux-headers libxml2-dev make gcc libc-dev nodejs yarn tzdata bash mysql-dev && \
    apk add --no-cache -t .build-packages --no-cache build-base curl-dev mysql-client && \
    bundle install -j4 && \
    apk del --purge .build-packages

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

変更点

  • base imageを変更
  • .build-packages というタグを付与し、bundle install 時のみに必要なパッケージは削除

メモ

  • mysql-devはRailsの起動中にmysql接続に必要だが、mysql-clientは bundle install 時に必要
  • yarnはRails6より、webpackerで使用するために必要

Docker imageの容量を比べてみる

alpineを利用することでDocker imageのサイズを減らすことが可能です。
どれぐらいの減量できたかを計測しておきます。

REPOSITORY         TAG     SIZE
ruby-rails         latest  1.12GB
alpine-ruby-rails  latest  426MB

2倍以上のSIZEの違いが出ました。

軽量化のメリット

Dockerイメージの軽量化のメリット

  • ビルド時間の短縮
  • pull/push時の時間短縮

というものがあります。

Dockerイメージに関わる時間が短縮されることによって、CI/CDに関わる時間が短縮されるため、開発効率の向上やデプロイ改善に役立ちます。

note

勉強法やキャリア構築法など、エンジニアに役立つ記事をnoteで配信しています。

https://note.com/ring_belle/membership

Discussion