为 Symfony 减小 Docker 图片大小 + phpoffice/phpspreadsheet?

Reduce Docker image size for Symfony + phpoffice/phpspreadsheet?

这是我的旧自定义 Dockerfile,我想让它更苗条:

FROM php:7.2-apache

RUN \
    apt-get update \
    && apt-get -y --no-install-recommends install \
        # composer dependencies
        git unzip openssh-client \
        # utils for scripts
        sudo \
        # for the 'zip' PHP extension
        libghc-zlib-dev \
        # for avoiding 'zip' PHP extension's "deprecated" warnings
        libzip-dev \
        # for 'soap' PHP extension
        libxml2-dev \
        # for 'gd' PHP extension
        libpng-dev \
        # cleanup cache
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/* \
    # installing composer
    && curl -sS https://getcomposer.org/installer | \
       php -- --install-dir=/usr/local/bin --filename=composer \
    # for parallel composer install
    && composer global require hirak/prestissimo --no-plugins --no-scripts \
    # PHP extensions special settings
    # (to avoid "deprecated" warnings)
    && docker-php-ext-configure zip --with-libzip \
    # install PHP extensions
    && docker-php-ext-install \
        # mysql
        pdo_mysql mysqli \
        # zip, needed for xlsx processing
        zip \
        # for soap APIs
        soap bcmath \
        # for phpoffice/phpspreadsheet
        gd \
        # for symfony/polyfill-iconv
        intl \
        # for caching
        opcache

我检查了一些点后的总图像大小:

正如我所见,它们占据了大部分 space:libghc-zlib-dev、libxml2-dev。

编辑:

我在@Jakumi 的评论后做了一些实验,结果是我删除了 libghc-zlib-dev 并添加了 zlib1g-dev 并且一切似乎仍然有效,而图像大小从 1.11G 下降到 542M

我在试验时发现的一些有用的链接:

你的脚本 运行 看起来很多东西都是当场编译的。

我不太确定,这是否真的是您故意的。无意冒犯,但我猜该脚本要么是被复制的,要么是您继承的。

为了简单起见,我的方法是不在 docker 容器中编译东西,除非真的 beneficial/necessary,并且在某种程度上信任系统的包管理器。

例如:php-zip 包中提供了 zip 函数,已编译为 php 中的模块。 xml 函数在 php-xml 包中提供,并且已经编译。许多其他包也是如此。 (我不知道安装这些软件包是否会自动启用它们,无论哪种方式我都不会感到惊讶。但是如果默认情况下未启用它们,您将不得不编写一个启用它们的脚本......但我'我很自信,你可以找到教程或其他东西)。编译后的库比库加上它们的源代码(以及依赖项中编译的源代码)小得多。

因为我不知道你的确切项目,也许它确实需要编译所有这些无论出于什么原因,也许是为了获得最后一个百分比(或二十......)的性能,所以该脚本中的所有行可能有一个很好的理由。

所以最后,它归结为反复试验。

回答您的问题:

  • Is there any slimmer solution to this?

很有可能,使用预编译的东西

  • Can I delete something that is needed only at build time?

很有可能,理论上您只需要编译的库

  • Can I replace these with something smaller?

见上文,但可能会产生不可预见的后果。如果您关心性能,请使用原始版本和预编译版本对性能进行基准测试。为了检查正确性(如果您怀疑)将所有请求发送到原始版本和预编译版本并检查输出的身份。

  • Do I really need a 500M package (libghc-zlib-dev) to read .xlsx files with phpoffice/phpspreadsheet?

可能不会

总体而言:使用预编译库会对性能产生(负面)影响,您可能编译了不需要的东西。但是,我不希望性能提升值得花时间,而只是使用预编译的库。 (最重要的是:您还可以选择不同的 docker 图像 - 甚至可能是高山图像 - 它根本不需要任何编译并且已经预装了大部分东西并且可能仍然更小 - 查看假设源docker您扩展的文件,您添加的库可能已经被编译,您只是重新编译它们...)

这显然是一个自以为是的答案。肯定有人喜欢自己编译东西,而且绝对有很好的理由这样做。