减少Symfony + phpoffice / phpspreadsheet的Docker映像大小?

时间:2019-09-19 17:12:06

标签: symfony phpspreadsheet docker-image

这是我的旧自定义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

经过一些检查,我检查了总图像尺寸:

  • php:7.2-apache之后为380M
  • 在git解压缩openssh-client后为408M
  • 须藤后408M
  • libghc-zlib-dev之后为962M->这是加上554M
  • libzip-dev后为962M
  • libxml2-dev后的1.1G->这是200M
  • libpng-dev之后的1.1G
  • 最后总共有1.11G

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

  • 有没有更苗条的解决方案?
  • 我可以删除仅在构建时需要的内容吗?
  • 我可以用更小的东西代替它们吗?
  • 我真的需要500M软件包(libghc-zlib-dev)来使用phpoffice / phpspreadsheet读取.xlsx文件吗?

编辑:

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

我在实验中发现了一些有用的链接:

1 个答案:

答案 0 :(得分:0)

您正在运行的脚本看起来像是在现场编译很多东西。

我不确定,如果这实际上是您有意为之。并不想冒犯,但我猜想脚本要么被复制,要么是您继承的。

为了简单起见,我的方法是除非真正有用/必要,否则不要在docker容器中编译内容,并在某种程度上信任系统的程序包管理器。

例如:php-zip软件包中提供了zip函数,该软件包已经编译为php中的模块。 xml函数在php-xml包中提供,并且已经编译过。类似地,对于许多其他软件包。 (我不知道安装这些软件包是否会自动启用它们,我不会对此感到惊讶。如果默认情况下未启用它们,则您必须编写一个能够启用它们的脚本...但是我我很有信心,您可以找到教程或其他内容。编译的库比库及其源代码(以及依赖项中编译的源代码)小得多。

由于我不知道您的确切项目,也许出于某种原因它确实需要编译所有代码,也许是为了获得最后百分之一(或二十...)的性能,所以该脚本中的所有行可能都有一个很好的理由。

因此,最后归结为反复试验。

回答您的问题:

  
      
  • 有没有更苗条的解决方案?
  •   

最有可能使用预编译的内容

  
      
  • 我可以删除仅在构建时需要的内容吗?
  •   

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

  
      
  • 我可以用更小的东西代替它们吗?
  •   

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

  
      
  • 我真的需要500M软件包(libghc-zlib-dev)来使用phpoffice / phpspreadsheet读取.xlsx文件吗?
  •   

可能不是

总体:使用预编译的库可能会对性能产生负面影响,您可能会在其中编译不需要的东西。但是,我不会期望性能提升值得花时间,而只能使用预编译的库。 (最重要的是:您可能还选择了一个不同的docker映像-甚至可能是一个高山映像-完全不需要任何编译,并且已经预装了大多数东西,并且可能仍然较小-查看假定您扩展的源dockerfile,您添加的库可能已经在其中进行编译,而您只是在重新编译它们...)

这显然是一个自以为是的答案。当然,有些人喜欢自己编译东西,绝对有充分的理由这么做。