docker通过多阶段构建以缩减镜像大小的一个实例

admin 2021-3-14 34054

这几天通过docker部署一个简单的Flask应用,为了减少硬盘占用以及加快镜像拉取速度,需要尽量缩减镜像大小。首先想到的是把基础镜像由原来的Ubuntu改为alpine,这样就可以让镜像大大缩小。但是在构建过程中,发现一个python依赖库 pycryptodome在alpine上是以源代码方式安装的,要求alpine安装gcc编译环境。这样一来,又会使镜像增大。最后考虑以多阶段编译的方式,先把pycryptodome编译后,再复制到目标镜像,目标镜像中不需要安装gcc编译环境,就可以尽可能保持精干的身材。

下面是Dockerfile的源文件:

###########################################
# 首先构建一个编译环境用以把pycryptodome编译成whl文件
FROM python:3.8.8-alpine3.13 as build    # 编译环境镜像指定别名 build
WORKDIR /app                             # 指定工作目录,等下从该目录复制编译好的whl文件
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories  #把alpine源替换成清华大学源
RUN set -e \
    && apk add --no-cache gcc musl-dev g++ make libffi-dev openssl-dev git    #安装gcc编译环境               
# build
RUN pip wheel --no-deps pycryptodome==3.10.1          # 开始编译pycryptodome
RUN ls -al /app                                       # 查看一下工作目录,是否生成了whl文件

##########################################
# 然后构建正式镜像
FROM python:3.8.8-alpine3.13
LABEL maintainer="CFSoft Studio <wdmsyf@sina.com>, QQ: 360026606, wechat: 360026606"
COPY --from=build /app /                               # 从编译环境镜像中把编译好的文件复制到当前镜像  

# 复制源代码
COPY src /src/                                         # 把我的应用源代码复制进镜像 
COPY config /config                                    # 把配置文件复制进镜像 

# 安装上面编译的 whl文件和应用依赖的其他模块
RUN pip install pycryptodome-3.10.1-cp35-abi3-linux_x86_64.whl \                            
    && pip install -r /src/requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

VOLUME /config                                                      

EXPOSE 5000

ENTRYPOINT ["python", "-u",  "/src/app.py"]

这就是整个Dockerfile文件,里面关键行都已经注释清楚了。接下来直接编译即可:

docker build -t wdmsyf/myadd:1.0 .


这样构建出来的镜像是102M,比原来基于Ubuntu构建的700多M少了6倍



最新回复 (0)
返回