🌊

Docker imageの容量が大きい?Check !

2021/12/22に公開

Docker Imageの容量は環境によってかなり大事だったりする。
特にAWS Fargateで使うイメージの場合
容量によってDeploy時間、データ通信料金がかなり変わったりする。

1. Chain

コマンドが増える = Layerも増える。
Layerが多くなる = イメージのSizeも大きくなる。

Before

RUN apt-get update
RUN apt install -y libpq5
RUN apt-get clean

After

RUN apt-get update \
    && apt install -y libpq5 \
    && apt-get clean

2. ADD vs COPY

COPYはリモートでファイルを追加できないし、圧縮ファイルを自動解凍してくれない
ADDはリモートでファイルを追加できるし、圧縮ファイルを自動解凍してくれる

Before

COPY 圧縮ファイル.tar.gz ./
RUN tar xvzf file.tar.gz

After

ADD 圧縮ファイル.tar.gz ./

3. Select Base Image

Pythonの場合、slim/buster/alpine などイメージの種類がかなり多い
see.https://hub.docker.com/_/python

$ docker images | grep python
python              3.8-buster   02a6ec2104c6   26 hours ago   884MB
python              3.8-slim     23a6a071a881   26 hours ago   122MB
python              3.8-alpine   d314e28e240c   3 weeks ago    43.2MB

イメージのbaseになったOSや含まれているPackageが違うため、容量がかなり異なる。
自分の環境に合う軽いイメージを選択することが大事。

4. 不要なファイルは削除する

不要なファイルの容量はその分、イメージの容量を増やす。

before

RUN curl -O https://DownloadFile

after

RUN curl -O https://DownloadFile
RUN rm DownloadFile

5. Clean Cache

before

RUN apt-get update && apt-get install -y \
    build-essential \
    curl
RUN yum install -y vim

after

RUN apt-get update && apt-get install -y \
    build-essential \
    curl \
    && rm -rf /var/lib/apt/lists/*
RUN yum install -y vim \
    && rm -rf /var/cache/yum/* \
    && yum clean all

--no-install-recommendsなどのoptionも忘れずに。

6. 開発用のライブラリはDeployイメージにインストールしない

before

RUN pipenv install --dev

RUN npm install

after

RUN pipenv install
RUN npm ci
RUN npm install --production

7. .dockerignore

.dockerignoreファイルを作成することで、必要ないファイルをCOPY対象から除外する。

.git
.github
Dockerfile
node_modules
logs
.
.
.

など。

8. multi-stage build

Layerの数、不要なファイルによってイメージの容量が大きく変わる。
stageを分けて最終的に必要なファイルだけをBuild StageからDeploy Stageに持ってくることで、大きく容量を減らすことが可能
see.https://docs.docker.com/develop/develop-images/multistage-build/

Case) NginixにReact builファイルをDeployする

FROM node:14.16-alpine3.10 as builder
WORKDIR /app
COPY ./package.json ./
RUN npm install
COPY ./ ./
RUN npm run build

FROM nginx
COPY --from=builder /app/build /usr/share/nginx/html

最終的にこのイメージにはReactのBuildファイル+nginxだけになる。

Discussion