Closed10
Dockerfile軽量化
この記事を参考にDockerfileの軽量化を試みる
実施前
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"]
イメージを3.1.1-alpine3.15
にしてみる
雑にコピペしただけだがサイズは半分くらいになった。ただ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"]
vimは使えたし、日本語も大丈夫だった。
bashで入れないと不便なのでbashを追加
マルチステージ採用
さらに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 /usr/local/bundle /usr/local/bundle
COPY . .
CMD ["rails", "server", "-b", "0.0.0.0"]
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 /usr/local/bundle /usr/local/bundle
COPY . .
CMD ["rails", "server", "-b", "0.0.0.0"]
マルチステージにしたことで、最終イメージをキャッシュしても--cache-fromで使えないことがわかった。
--cache-fromの場合、指定したイメージをキャッシュとして利用するが、マルチステージの場合最終イメージにはキャッシュされていて欲しい情報はほぼ残っていないためキャッシュとしての役割を果たさない。
中間イメージにタグをつけて、ステージごとにbuildして中間ステージのイメージを生成。それを--cache-fromで指定することでキャッシュとして使える。
詳細はこの記事参照
マルチステージをやめた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"]
開発で数日使った問題点
・コンパイルに必要なライブラリを削除しているので、bundle updateでコンパイルが必要なものがアップデートできない。アップデート前に手動でライブラリを入れる必要がある。滅多にないから手動でもいいか。。
このスクラップは2022/03/22にクローズされました