Docker imageの容量が大きい?Check !
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 /app/build /usr/share/nginx/html
最終的にこのイメージにはReactのBuildファイル+nginxだけになる。
Discussion