微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 减小泊坞窗图像的大小

我正在尝试使用Docker将Craft CMS部署到zeit/now.它在本地工作,但zeit的图像大小限制为100MB.我的容器目前是176MB.

它是使用Craft所需的alpine,NginxPHP模块的Docker镜像,并使用多阶段构建来构建Composer组件,以减少构建工件的大小.

这是Dockerfile:

FROM zeit/wait-for:0.2 as wait

# Build dependencies
FROM composer:latest as vendor

copY composer.json composer.json
copY composer.lock composer.lock

RUN composer install --ignore-platform-reqs --no-interaction --no-plugins --no-scripts --prefer-dist --no-dev

FROM alpine:3.8

LABEL maintainer="Eivind Mikael Lindbråten <[email protected]>"
LABEL description="Minimal Craft CMS Container using Nginx."

# install Nginx, PHP, and PHP extensions for Craft
RUN apk add --no-cache \
    bash \
    Nginx \
    PHP7 \
    PHP7-fpm \
    PHP7-opcache \
    PHP7-phar \
    PHP7-zlib \
    PHP7-ctype \
    PHP7-session \
    PHP7-fileinfo \
# required PHP extensions for Craft
    PHP7-pdo \
    PHP7-pdo_MysqL \
    PHP7-gd \
    PHP7-openssl \
    PHP7-mbstring \
    PHP7-json \
    PHP7-curl \
    PHP7-zip \
# Optional extensions for Craft
    PHP7-iconv \
    PHP7-intl \
    PHP7-dom

copY Nginx.conf /etc/Nginx/Nginx.conf
copY www.conf /etc/PHP7/PHP-fpm.d/

# copy over Craft files
copY config/ /www/config
copY modules/ /www/modules
copY storage/ /www/storage
copY templates/ /www/templates
copY storage/ /www/storage
copY web/ /www/web
copY .env /www/.env
copY composer.json /www/composer.json
copY composer.lock /www/composer.lock

# copy over vendor files
copY --from=vendor /app/vendor /www/vendor

# Set permissions
RUN chmod 777 -R /www/config
RUN chmod 777 -R /www/vendor
RUN chmod 777 -R /www/storage
RUN chmod 777 -R /www/web/cpresources
RUN chmod 777 /www/.env
RUN chmod 777 /www/composer.json
RUN chmod 777 /www/composer.lock

# Expose default port
EXPOSE 80

SHELL ["/bin/bash", "-c"]
copY --from=wait /bin/wait-for /bin/wait-for

CMD PHP-fpm7 -F & (wait-for /tmp/PHP7-fpm.sock && Nginx) & wait -n

我有什么想法可以进一步缩小这个尺寸吗?

解决方法:

编辑2018-09-26:大量修改以整理我的错误并包含所有依赖项.我以前的大部分内容都是无关紧要的,现在我已经包含了所有的依赖关系并且有合理的数字.

我从提供的存储库中构建了一个映像,以便查看已安装的软件包的完整列表,包括依赖项.我的构建没有完成,但它足以产生一个图像(5ed25a4a3cf1),显示间的位置.部分通过构建,在RUN apk添加…结束时,它说:

OK: 150 MiB in 102 packages

查看图像,根据泊坞历史记录(图像层8138a6c99655 – 您可能需要向右滚动才能看到大小列),我们看到这些包是145MB:

user@host:~/docker-craft-Nginx$sudo docker history 5ed25a4a3cf1
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT
5ed25a4a3cf1        About a minute ago   /bin/sh -c #(nop) copY dir:e9a848580d7409c11…   0B
79bba3526427        About a minute ago   /bin/sh -c #(nop) copY dir:41ddb696977d39ee6…   7.38kB
f4d1e79f00b4        About a minute ago   /bin/sh -c #(nop) copY dir:e9a848580d7409c11…   21B
ab8ad35f5a93        About a minute ago   /bin/sh -c #(nop) copY dir:4ff26c2555a73b795…   1.18kB
29a6368b96c5        About a minute ago   /bin/sh -c #(nop) copY dir:cb92d968d83d14948…   3.43kB
ea429fb6f1fa        About a minute ago   /bin/sh -c #(nop) copY file:b1cc7638b7536f51…   139B
f0e1dbcec6c5        About a minute ago   /bin/sh -c #(nop) copY file:e0f1165c2cf43ac3…   1.07kB
8138a6c99655        About a minute ago   /bin/sh -c apk add --no-cache     bash     n…   145MB
b743c478b647        2 minutes ago        /bin/sh -c #(nop)  LABEL description=Minimal…   0B
f3dab9765884        2 minutes ago        /bin/sh -c #(nop)  LABEL maintainer=Eivind M…   0B
196d12cf6ab1        11 days ago          /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           11 days ago          /bin/sh -c #(nop) ADD file:25c10b1d1b41d46a1…   4.41MB

鉴于要安装的软件包的完整列表(它们在图像构建期间显示),我们可以使用apk信息获取各自的大小-s NAME_OF_PACKAGE

(我按顺序按顺序对它们进行排序,我只显示前20个)

user@host:~$sudo docker run -it alpine sh -c "apk update; apk info -s ncurses-terminfo-base ncurses-terminfo ncurses-libs readline bash libxau libbsd libxdmcp libxcb libx11 libxext libbz2 expat libpng freetype fontconfig libgcc libgomp lcms2 libltdl libxml2 imagemagick-libs libxrender pixman cairo libffi libintl libuuid libblkid libmount pcre glib dbus-libs avahi-libs gmp nettle p11-kit libtasn1 libunistring gnutls libstdc++ cups-libs jbig2dec libjpeg-turbo tiff ghostscript libxft graphite2 harfbuzz pango libcroco shared-mime-info gdk-pixbuf librsvg libwebp imagemagick Nginx PHP7-common libedit PHP7 PHP7-ctype ca-certificates nghttp2-libs libssh2 libcurl PHP7-curl PHP7-dom PHP7-fileinfo PHP7-fpm libice libsm libxt libxpm PHP7-gd PHP7-iconv PHP7-imagick icu-libs PHP7-intl PHP7-json PHP7-mbstring PHP7-opcache PHP7-openssl PHP7-pdo PHP7-MysqLnd PHP7-pdo_MysqL PHP7-phar PHP7-session libzip PHP7-zip" | awk '/^[0-9]/{gsub(/[^0-9]+$/,"",$1); print $1,prev,"\r"; next}{prev=$1}' | sort -gr | head -n 20
50036736 ghostscript-9.24-r0
31248384 icu-libs-60.2-r2
7245824 ncurses-terminfo-6.1_p20180818-r1
5070848 PHP7-fileinfo-7.2.10-r0
4849664 PHP7-fpm-7.2.10-r0
4775936 PHP7-7.2.10-r0
4489216 imagemagick-7.0.7.32-r0
3440640 imagemagick-libs-7.0.7.32-r0
3379200 libx11-1.6.5-r1
3010560 glib-2.56.1-r0
2338816 shared-mime-info-1.9-r0
2203648 harfbuzz-1.7.6-r1
1638400 PHP7-mbstring-7.2.10-r0
1470464 libunistring-0.9.7-r0
1384448 libstdc++-6.4.0-r8
1282048 gnutls-3.6.2-r0
1236992 p11-kit-0.23.10-r0
1224704 libxml2-2.9.8-r0
1187840 libcroco-0.6.12-r1
1175552 Nginx-1.14.0-r1

或者所有包装的总大小:

user@host:~$sudo docker run -it alpine sh -c "apk update; apk info -s ncurses-terminfo-base ncurses-terminfo ncurses-libs readline bash libxau libbsd libxdmcp libxcb libx11 libxext libbz2 expat libpng freetype fontconfig libgcc libgomp lcms2 libltdl libxml2 imagemagick-libs libxrender pixman cairo libffi libintl libuuid libblkid libmount pcre glib dbus-libs avahi-libs gmp nettle p11-kit libtasn1 libunistring gnutls libstdc++ cups-libs jbig2dec libjpeg-turbo tiff ghostscript libxft graphite2 harfbuzz pango libcroco shared-mime-info gdk-pixbuf librsvg libwebp imagemagick Nginx PHP7-common libedit PHP7 PHP7-ctype ca-certificates nghttp2-libs libssh2 libcurl PHP7-curl PHP7-dom PHP7-fileinfo PHP7-fpm libice libsm libxt libxpm PHP7-gd PHP7-iconv PHP7-imagick icu-libs PHP7-intl PHP7-json PHP7-mbstring PHP7-opcache PHP7-openssl PHP7-pdo PHP7-MysqLnd PHP7-pdo_MysqL PHP7-phar PHP7-session libzip PHP7-zip" | awk '/^[0-9]+/ {s+=$1} END {printf "%.0f\n", s}'
152952832

在这一点上,看起来你的问题是“你的东西太大”问题,而不是码头问题.你以前可能知道或者可能不知道那部分,但我已经学会了一些关于挖掘码头的东西,所以它很有趣:-)

编辑2018-09-25:这在纠正我之前的错误后现在没那么有用了,但可能仍然有一些相关信息:我觉得即使我的完整图像构建失败,我也不在乎为什么 – 我们只对在安装apks的大层中进行探索感兴趣.所以,我做了一个相当小的dockerfile:

FROM alpine:3.8

# install Nginx, PHP, and PHP extensions for Craft
RUN apk add --no-cache \
    bash \
    Nginx \
    PHP7 \
    PHP7-fpm \
    PHP7-opcache \
    PHP7-phar \
    PHP7-zlib \
    PHP7-ctype \
    PHP7-session \
    PHP7-fileinfo \
# required PHP extensions for Craft
    PHP7-pdo \
    PHP7-pdo_MysqL \
    PHP7-gd \
    PHP7-openssl \
    PHP7-mbstring \
    PHP7-json \
    PHP7-curl \
    PHP7-zip \
# Optional extensions for Craft
    PHP7-iconv \
    PHP7-intl \
    PHP7-dom \
# Extra Optional extensions for Craft
    imagemagick \
    PHP7-imagick

CMD sh

建造它:sudo docker build.并获得了一张图片成功构建了e344a23763c9.使用sudo docker run -it e344a23763c9从这个映像运行容器我有一个shell.安装ncdu(我可以通过dockerfile安装)与apk添加–no-cache ncdu然后运行ncdu / – 现在我可以很容易地看到大目录在哪里,从根开始(注意:我已修剪小文件和放大器;来自输出的dirs):

  146.0 MiB [##########] /usr                                                                                                                                  
    3.6 MiB [          ] /lib
    2.0 MiB [          ] /etc
    1.4 MiB [          ] /bin

导航到/ usr我们发现:

   84.4 MiB [##########] /lib
   35.6 MiB [####      ] /share
   20.5 MiB [##        ] /bin
    5.5 MiB [          ] /sbin

在/usr/lib中:

   25.7 MiB [##########]  libicudata.so.60.2
   15.0 MiB [#####     ]  libgs.so.9.24
    9.0 MiB [###       ] /PHP7
    3.9 MiB [#         ] /ImageMagick-7.0.7
    2.3 MiB [          ]  libicui18n.so.60.2
    2.2 MiB [          ]  libmagickCore-7.Q16HDRI.so.6.0.0
    1.5 MiB [          ]  libicuuc.so.60.2
    1.4 MiB [          ]  libgio-2.0.so.0.5600.1
    1.4 MiB [          ]  libunistring.so.2.0.0
    1.3 MiB [          ]  libstdc++.so.6.0.22
    1.2 MiB [          ]  libgnutls.so.30.20.2
    1.2 MiB [          ]  libxml2.so.2.9.8
    1.1 MiB [          ]  libX11.so.6.3.0
    1.1 MiB [          ]  libmagickWand-7.Q16HDRI.so.6.0.0
    1.1 MiB [          ]  libp11-kit.so.0.3.0

在/usr/share中:

   17.7 MiB [##########] /ghostscript
    6.9 MiB [###       ] /terminfo
    5.6 MiB [###       ] /mime
    2.3 MiB [#         ] /gtk-doc
    2.1 MiB [#         ] /X11

在/usr/bin中:

   14.8 MiB [##########]  gs
    4.5 MiB [###       ]  PHP7

在我看来,像imagemagick是最大的贡献者(以及它的依赖ghostscript).在没有imagemagick&amp ;;的情况下运行试用版PHP7-imagick产生的图像层大小为65.8MB(由docker history报告).

删除PHP7-intl将层降低到32.7MB(主要是通过删除libicudata.so.60.2,它是“Unicode的国际组件”的一部分)

如果你想要一个比你原来更小的容器,我认为你要么需要取消图像处理和国际化,要么找到更小的方法来实现它们 – 它们是最大可能的可修剪组件(取决于你的东西)想要实现).

通过组合chmod调用,您可以大大减小尺寸/层数:

RUN chmod 777 -R \
   /www/config \
   /www/vendor \
   /www/storage \
   /www/web/cpresources \
&& chmod 777 \
   /www/.env \
   /www/composer.json \
   /www/composer.lock

编辑2018-09-29:我注意到图像中的terminfo数据库[可能]过多 – 根据ncurses-terminfo的alpine包数据库条目,大约7MB.它几乎每个可能的术语都有终止,这对于一个Docker来说似乎有点过头了容器(取决于你在做什么).

我看不到一个简单的方法来不安装该软件包(其他东西需要它安装,我找不到一个明智的方法来强迫apk不尊重依赖),但你可以得到RUN apk添加.. .在提交图层之前删除未使用的terminfos的行 – 删除大部分files.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐