前言
本小结主要结合实践,如何针对Docker镜像进行瘦身,通过其多阶段构建特性进行
一、前后对比
基本镜像 | 说明 | 大小 |
Centos7 | 单一构建 | 1.02GB |
Alpine3 | 单一构建 | 678MB |
Alpine3 | 多阶段构建 | 312MB |
二、环境
环境 | 版本 | 说明 |
Docker | 19.03.1 | 必须大于17.05,此后才支持多阶段构建 |
Django | 3.1.10 |
三、Dockerfile
以下是最后的Dockerfile,可以看到一共有三个阶段:
(1)阶段一:通过选用的python:3.7.4-alpine3.10作为基础镜像,在此阶段构建必要编译环境等
(2)阶段二:FROM Base as Build,依赖上述镜像,在此阶段构建应用需要的环境(python安装包),其他应用同理
(3)阶段三:正式镜像,通过COPY --from=Build /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages等操作,将阶段二已构建好的包,复制至正式镜像中,应用启动并不关心安装依赖包等过程
FROM python:3.7.4-alpine3.10 as Base # 1. 基础镜像
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache build-base vim gcc linux-headers libffi-dev mariadb-connector-c-dev
FROM Base as Build # 2. 安装依赖
ENV CRYPTOGRAPHY_DONT_BUILD_RUST=1
COPY requirements.txt /tmp
RUN pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple \
&& pip install --no-cache-dir -r /tmp/requirements.txt -i https://pypi.douban.com/simple
FROM python:3.7.4-alpine3.10 # 3. 正式镜像
ENV TZ=Asia/Shanghai
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk --no-cache add tzdata mariadb-connector-c-dev \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone && rm -rf /var/cache/apk/*
COPY --from=Build /usr/local/lib/python3.7/site-packages /usr/local/lib/python3.7/site-packages
COPY --from=Build /usr/local/bin/uwsgi /usr/local/bin/uwsgi
ADD app.tar.gz /opt # 引入程序代码
WORKDIR /opt/app
ENTRYPOINT ["sh", "./script/start_app.sh"] # 启动应用
总结
通过上述Dockerfile的多次构建,正式镜像体积缩减效果显著。