减less自定义Docker镜像大小的最佳方法

我已经build立了一个基于官方PHP FPM图像 php:7.0.14-fpm-alpine的定制Docker镜像

我想保持图像的大小,所以我select了正式的alpine PHP-FPM版本,因为它的重量只有27 MB

我通过Dockerfile只安装了几个额外的软件包,图像的大小增加到277.5 MB 。 这是我的Dockerfile:

 FROM php:7.0.14-fpm-alpine COPY ./config/www-pool.conf /usr/local/etc/php-fpm.d/www.conf COPY ./scripts/download-composer.sh /root/download-composer.sh WORKDIR /root RUN chmod +x download-composer.sh \ && ./download-composer.sh \ && mv composer.phar /usr/local/bin/composer RUN ["mkdir", "/var/log/php-fpm"] RUN apk --update add \ autoconf g++ make \ openssl-dev \ libxml2-dev RUN pecl install \ xdebug \ mongodb RUN docker-php-ext-enable \ xdebug.so \ mongodb.so RUN docker-php-ext-install \ pdo_mysql \ soap RUN addgroup sudo RUN adduser -S luqo33 -G sudo RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers 

与基本图像相比,277.5 MB的尺寸增加了十倍。 除了Composer,我所需要的只是几个PHP扩展:

  • MongoDB的
  • Xdebug的
  • PDO
  • 肥皂

我不知道是什么贡献最大的增加我的形象的规模如此之多。 我怀疑这可能是由于为了成功运行peclopenssl-devlibxml2-dev )而需要安装的dev依赖项,并且可能已经安装了它们自己的依赖关系树。

您能否告诉我如何缩小我的自定义PHP-FPM镜像的大小,并保留必要的扩展名?

我用两种不同的方法来构build你的图像的初始部分来testing它。 这个问题的一个普遍的答案是,包索引占用额外的空间。 在Alpine Linux(使用APK)的情况下,可以像这样清理软件包索引:

 rm -rf /var/cache/apk/* 

但是,我build立了图像的第一部分,无论是否有清理。 它几乎没有任何区别(0.8 MB)。

 FROM php:7.0.14-fpm-alpine WORKDIR /root RUN ["mkdir", "/var/log/php-fpm"] RUN apk --update add \ autoconf g++ make \ openssl-dev \ libxml2-dev \ && rm -rf /var/cache/apk/* 

无论清理命令是否存在,图像的重量都是267MB。

 REPOSITORY TAG IMAGE ID CREATED SIZE php-fpm-alpine-test2 latest b87f5e2d629d 23 seconds ago 267.1 MB php-fpm-alpine-test1 latest 8ff7df8bebea 6 minutes ago 267.9 MB 

使用的空间只是你正在安装的软件包。

 Step 4 : RUN apk --update add autoconf g++ make openssl-dev libxml2-dev && rm -rf /var/cache/apk/* ---> Running in 037a929d9e6a fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.4/community/x86_64/APKINDEX.tar.gz (1/23) Installing m4 (1.4.17-r1) (2/23) Installing perl (5.22.2-r0) (3/23) Installing autoconf (2.69-r0) (4/23) Installing libgcc (5.3.0-r0) (5/23) Installing libstdc++ (5.3.0-r0) (6/23) Installing binutils-libs (2.26-r0) (7/23) Installing binutils (2.26-r0) (8/23) Installing gmp (6.1.0-r0) (9/23) Installing isl (0.14.1-r0) (10/23) Installing libgomp (5.3.0-r0) (11/23) Installing libatomic (5.3.0-r0) (12/23) Installing pkgconf (0.9.12-r0) (13/23) Installing pkgconfig (0.25-r1) (14/23) Installing mpfr3 (3.1.2-r0) (15/23) Installing mpc1 (1.0.3-r0) (16/23) Installing gcc (5.3.0-r0) (17/23) Installing musl-dev (1.1.14-r14) (18/23) Installing libc-dev (0.7-r0) (19/23) Installing g++ (5.3.0-r0) (20/23) Installing zlib-dev (1.2.8-r2) (21/23) Installing libxml2-dev (2.9.4-r0) (22/23) Installing make (4.1-r1) (23/23) Installing openssl-dev (1.0.2j-r0) Executing busybox-1.24.2-r11.trigger OK: 220 MiB in 48 packages 

正如你从安装结束时的总结中可以看到的,apk已经安装了220MB的新内容。

我最好的build议是运行所有的安装,然后你可以尝试删除一些只需要构build的包,而不是在运行时。 比如你可能不再需要一些开发包,或者编译器,automake等等。

但是,您必须记住每个RUN命令会创build一个新层。 要以这种方式实际节省空间,您必须在单个RUN命令中运行您的apk命令,所有其他安装以及安装后清理,以使其成为单层。 否则,无论您是否清理,较早的图层仍将具有该内容,并且仍然会影响图像大小。

 RUN apk --update add \ autoconf g++ make \ openssl-dev \ libxml2-dev \ && pecl install \ xdebug \ mongodb \ && docker-php-ext-enable \ xdebug.so \ mongodb.so \ && docker-php-ext-install \ pdo_mysql \ soap \ && apk del autoconf g++ make openssl-dev libxml2-dev \ && rm -rf /var/cache/apk/*