image.png

引言

这是有关如何制作最小化Docker镜像系列文章中的第三篇。 在第一篇文章中,我谈到了如何通过编写更好的Dockerfiles创建较小的镜像,在第二篇文章中,我讨论了如何使用docker-squash压缩镜像层以制作更小的镜像。 这些方法确实很不赖,但是如果我们选择的基础镜像很大的话,之前两篇中介绍的方法将无济于事。

让我们看第二篇文章中的例子,Docker Hub上的标准python镜像,如果查看Dockerfile会发现它的基础镜像是Debian jessie。

FROM buildpack-deps:jessie
# ensure local python is preferred over distribution python
ENV PATH /usr/local/bin:$PATH
...

buildpack-deps:jessie镜像包含完整的Debian jessie发行版,很大。

~$ docker images buildpack-deps:jessie
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
buildpack-deps      jessie              3b84923989a0        3 weeks ago         614 MB

可以看到占用了614MB的空间,即使压缩它也无济于事,因为在基础Distribution中含有大量数据。

Alpine Linux

Alpine Linux是Linux的发行版之一,对于基础安装而言,该发行版非常小。 但是,即使它很小,它仍然具有一个不错的软件包存储库,其中包含许多软件包。 它还有类似于apt-get或yum的工具,可轻松安装这些软件包。

~$ docker images alpine:3.6
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
alpine              3.6                 a41a7446062d        5 days ago          3.966 MB

仅仅只有3.96 MB,与614MB的Debian jessie镜像相比,这是一个巨大的优势。 许多标准Docker映像都很方便地提供了Alpine Linux版本,通常,它具有-alpine后缀。 来看一个python的例子。

~$ docker images python:2.7.13-alpine
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
python              2.7.13-alpine       3dd614730c9c        4 days ago          72.02 MB

Python VM占用了约72MB的内存,远小于Debian python镜像的670MB。

使用Alpine构建镜像

使用Alpine构建镜像并使用Dockerfile中的apk工具安装Alpine软件包,通过执行以下操作来检出git repo。

FROM alpine:3.6
RUN apk add --update git && \
    git clone https://github.com/example/myrepo.git && \
    rm myrepo/.git && \
    apk del git && \
    rm -rf /var/cache/apk/*
CMD ['/myrepo/myapp']

https://pkgs.alpinelinux.org/...


EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术