deeeki

Rails開発 Dockerイメージ比較

よりシンプルで軽くメンテしやすいDockerイメージを求めて。

比較

Distribution Build Stage Build Time Image Size
Debian single 121.7s 585.87MB
Debian multi 104.5s 526.11MB
Alpine single 28.3s 652.87MB
Alpine multi 30.5s 694.64MB

single or multi はNode.jsバイナリをコピーするかどうか。

所感

  • おすすめっぽいのはサイズの軽いDebian (multi stage)
    • Aplineより軽かったのが意外
  • Alpineはビルド時間が短く、Dockerfile記述がシンプル

環境

  • M1 Mac
  • Docker Desktop for Mac 4.5.0
  • Rails 7.0.x / PostgreSQL 14.x
    • rails new (bundle) (yarn) rails s rails db ができるくらいまで

Dockerfile

Debian (single stage)

ARG DEBIAN_VERSION=bullseye
ARG RUBY_VERSION=3.1.1

FROM ruby:$RUBY_VERSION-slim-$DEBIAN_VERSION as base

ARG DEBIAN_VERSION=bullseye
ARG PG_MAJOR=14
ARG NODE_MAJOR=16
ARG BUNDLER_VERSION=2.3.8

RUN apt-get update -qq \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    curl \
    g++ \
    gcc \
    git \
    gnupg2 \
    make \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log

RUN curl -sL https://deb.nodesource.com/setup_$NODE_MAJOR.x | bash -
RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
  && echo "deb http://apt.postgresql.org/pub/repos/apt/ ${DEBIAN_VERSION}-pgdg main" $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

RUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get -yq dist-upgrade \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    libpq-dev \
    nodejs \
    postgresql-client-$PG_MAJOR \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log
RUN npm install --global yarn

ENV LANG=C.UTF-8 \
  BUNDLE_JOBS=4 \
  BUNDLE_RETRY=3

RUN gem update --system && gem install bundler -v $BUNDLER_VERSION

WORKDIR /app

Debian (multi stage)

ARG DEBIAN_VERSION=bullseye
ARG RUBY_VERSION=3.1.1
ARG NODE_VERSION=16.14.0

FROM node:$NODE_VERSION-$DEBIAN_VERSION-slim as node

FROM ruby:$RUBY_VERSION-slim-$DEBIAN_VERSION as base

ARG DEBIAN_VERSION=bullseye
ARG PG_MAJOR=14
ARG BUNDLER_VERSION=2.3.8

RUN apt-get update -qq \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    curl \
    g++ \
    gcc \
    git \
    gnupg2 \
    make \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log

RUN curl -sSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - \
  && echo "deb http://apt.postgresql.org/pub/repos/apt/ ${DEBIAN_VERSION}-pgdg main" $PG_MAJOR > /etc/apt/sources.list.d/pgdg.list

RUN apt-get update -qq && DEBIAN_FRONTEND=noninteractive apt-get -yq dist-upgrade \
  && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
    libpq-dev \
    postgresql-client-$PG_MAJOR \
  && apt-get clean \
  && rm -rf /var/cache/apt/archives/* \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \
  && truncate -s 0 /var/log/*log

COPY --from=node /usr/local/bin/node /usr/local/bin/node
COPY --from=node /opt/yarn-* /opt/yarn
RUN ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn

ENV LANG=C.UTF-8 \
  BUNDLE_JOBS=4 \
  BUNDLE_RETRY=3

RUN gem update --system && gem install bundler -v $BUNDLER_VERSION

WORKDIR /app

Alpine (single stage)

ARG ALPINE_VERSION=3.15
ARG RUBY_VERSION=3.1.1

FROM ruby:$RUBY_VERSION-alpine$ALPINE_VERSION as base

ARG PG_MAJOR=14
ARG BUNDLER_VERSION=2.3.8

# https://github.com/sparklemotion/nokogiri/issues/2430#issuecomment-1016650754
RUN apk add --no-cache \
  bash \
  g++ \
  gcc \
  gcompat \
  git  \
  make \
  musl-dev \
  nodejs \
  postgresql$PG_MAJOR-client \
  postgresql$PG_MAJOR-dev \
  tzdata \
  yarn \
  && rm -rf /var/cache/apk/*

ENV LANG=C.UTF-8 \
  BUNDLE_JOBS=4 \
  BUNDLE_RETRY=3

RUN gem update --system && gem install bundler -v $BUNDLER_VERSION

WORKDIR /app

Alpine (multi stage)

ARG ALPINE_VERSION=3.15
ARG RUBY_VERSION=3.1.1
ARG NODE_VERSION=16.14.0

FROM node:$NODE_VERSION-alpine$ALPINE_VERSION as node

FROM ruby:$RUBY_VERSION-alpine$ALPINE_VERSION as base

ARG PG_MAJOR=14
ARG BUNDLER_VERSION=2.3.8

# https://github.com/sparklemotion/nokogiri/issues/2430#issuecomment-1016650754
RUN apk add --no-cache \
  bash \
  g++ \
  gcc \
  gcompat \
  git  \
  make \
  musl-dev \
  postgresql$PG_MAJOR-client \
  postgresql$PG_MAJOR-dev \
  tzdata \
  && rm -rf /var/cache/apk/*

COPY --from=node /usr/local/bin/node /usr/local/bin/node
COPY --from=node /opt/yarn-* /opt/yarn
RUN ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn

ENV LANG=C.UTF-8 \
  BUNDLE_JOBS=4 \
  BUNDLE_RETRY=3

RUN gem update --system && gem install bundler -v $BUNDLER_VERSION

WORKDIR /app