这是我的旧自定义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
经过一些检查,我检查了总图像尺寸:
正如我所见,它们占据了大部分空间:libghc-zlib-dev,libxml2-dev。
编辑:
我在@Jakumi的评论后做了一些实验,结果是我删除了libghc-zlib-dev并添加了zlib1g-dev,但一切似乎仍然正常,而图像大小从1.11G下降到了542M
我在实验中发现了一些有用的链接:
答案 0 :(得分:0)
您正在运行的脚本看起来像是在现场编译很多东西。
我不确定,如果这实际上是您有意为之。并不想冒犯,但我猜想脚本要么被复制,要么是您继承的。
为了简单起见,我的方法是除非真正有用/必要,否则不要在docker容器中编译内容,并在某种程度上信任系统的程序包管理器。
例如:php-zip
软件包中提供了zip函数,该软件包已经编译为php中的模块。 xml函数在php-xml
包中提供,并且已经编译过。类似地,对于许多其他软件包。 (我不知道安装这些软件包是否会自动启用它们,我不会对此感到惊讶。如果默认情况下未启用它们,则您必须编写一个能够启用它们的脚本...但是我我很有信心,您可以找到教程或其他内容。编译的库比库及其源代码(以及依赖项中编译的源代码)小得多。
由于我不知道您的确切项目,也许出于某种原因它确实需要编译所有代码,也许是为了获得最后百分之一(或二十...)的性能,所以该脚本中的所有行可能都有一个很好的理由。
因此,最后归结为反复试验。
回答您的问题:
- 有没有更苗条的解决方案?
最有可能使用预编译的内容
- 我可以删除仅在构建时需要的内容吗?
最有可能,理论上您只需要编译的库
- 我可以用更小的东西代替它们吗?
请参见上文,但可能会产生不可预见的后果。如果您关心性能,请使用原始版本和预编译版本对性能进行基准测试。用于检查是否正确(如果您对此表示怀疑),请将所有请求发送到原始版本和预编译版本,并检查输出的身份。
- 我真的需要500M软件包(libghc-zlib-dev)来使用phpoffice / phpspreadsheet读取.xlsx文件吗?
可能不是
总体:使用预编译的库可能会对性能产生负面影响,您可能会在其中编译不需要的东西。但是,我不会期望性能提升值得花时间,而只能使用预编译的库。 (最重要的是:您可能还选择了一个不同的docker映像-甚至可能是一个高山映像-完全不需要任何编译,并且已经预装了大多数东西,并且可能仍然较小-查看假定您扩展的源dockerfile,您添加的库可能已经在其中进行编译,而您只是在重新编译它们...)
这显然是一个自以为是的答案。当然,有些人喜欢自己编译东西,绝对有充分的理由这么做。