Closed10

Dockerfile軽量化

hamham

実施前

rails_api_base_api                       latest        85d11d6e13ce   6 minutes ago   1.57GB
Dockerfile
FROM ruby:3.1.1

RUN apt-get update && apt-get install -y \
    build-essential \
    vim \
    locales \
    locales-all \
    default-mysql-client \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

ENV LANG ja_JP.UTF-8

RUN mkdir /app
WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install

COPY . .

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

hamham

イメージを3.1.1-alpine3.15にしてみる

hamham

雑にコピペしただけだがサイズは半分くらいになった。ただlocaleなどを削ったので色々足りない気がする。

rails_api_base_api                       latest        cd4d02b7f1a4   17 seconds ago   685MB
Dockerfile
FROM ruby:3.1.1-alpine3.15

RUN apk update && \
    apk add --no-cache \
    gcc \
    g++ \
    libc-dev \
    libxml2-dev \
    linux-headers \
    make \
    mysql-client \
    mysql-dev \
    tzdata && \
    apk add --virtual build-packs --no-cache \
    build-base \
    curl-dev

RUN mkdir /app
WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install
RUN apk del build-packs

COPY . .

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

vimは使えたし、日本語も大丈夫だった。
bashで入れないと不便なのでbashを追加

hamham

マルチステージ採用
さらに200MBほど減った!

rails_api_base_api                       latest        65def94f588f   About a minute ago   450MB
Dockerfile
FROM ruby:3.1.1-alpine3.15 as builder

RUN apk update && \
    apk add --no-cache \
    gcc \
    g++ \
    libc-dev \
    libxml2-dev \
    linux-headers \
    make \
    mysql-client \
    mysql-dev \
    tzdata && \
    apk add --virtual build-packs --no-cache \
    build-base \
    curl-dev

RUN mkdir /app
WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install
RUN apk del build-packs

FROM ruby:3.1.1-alpine3.15

RUN apk update && \
    apk add \
    mysql-dev \
    bash \
    tzdata

RUN mkdir /app
WORKDIR /app

COPY --from=builder /usr/local/bundle /usr/local/bundle

COPY . .

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

config.active_record.schema_format = :sqlでマイグレーションするためにはmysql-clientも必要だったので追加。
ちょっとサイズが増えた。

rails_api_base_api                       latest        ace9fc803fa7   15 seconds ago   480MB
Dockerfile
FROM ruby:3.1.1-alpine3.15 as builder

RUN apk update && \
    apk add --no-cache \
    gcc \
    g++ \
    libc-dev \
    libxml2-dev \
    linux-headers \
    make \
    mysql-client \
    mysql-dev \
    tzdata && \
    apk add --virtual build-packs --no-cache \
    build-base \
    curl-dev

RUN mkdir /app
WORKDIR /app

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install
RUN apk del build-packs

FROM ruby:3.1.1-alpine3.15

RUN apk update && \
    apk add \
    mysql-client \
    mysql-dev \
    bash \
    tzdata

RUN mkdir /app
WORKDIR /app

COPY --from=builder /usr/local/bundle /usr/local/bundle

COPY . .

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

マルチステージにしたことで、最終イメージをキャッシュしても--cache-fromで使えないことがわかった。
--cache-fromの場合、指定したイメージをキャッシュとして利用するが、マルチステージの場合最終イメージにはキャッシュされていて欲しい情報はほぼ残っていないためキャッシュとしての役割を果たさない。
中間イメージにタグをつけて、ステージごとにbuildして中間ステージのイメージを生成。それを--cache-fromで指定することでキャッシュとして使える。

詳細はこの記事参照
https://kotaroooo0-dev.hatenablog.com/entry/2020/08/06/012316

hamham

マルチステージをやめたDockerfile

FROM ruby:3.1.1-alpine3.15

RUN apk update && \
    apk add --no-cache \
    mysql-client \
    mysql-dev \
    bash \
    vim \
    tzdata && \
    apk add --virtual build-packs --no-cache \
    gcc \
    g++ \
    libc-dev \
    libxml2-dev \
    linux-headers \
    make \
    build-base \
    curl-dev

RUN mkdir /app
WORKDIR /app

ENV RUBY_YJIT_ENABLE=1

COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN bundle install
RUN apk del build-packs

COPY . /app

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

開発で数日使った問題点
・コンパイルに必要なライブラリを削除しているので、bundle updateでコンパイルが必要なものがアップデートできない。アップデート前に手動でライブラリを入れる必要がある。滅多にないから手動でもいいか。。

このスクラップは2022/03/22にクローズされました