Уменьшить размер образа Docker для Symfony + phpoffice / phpspreadsheet? - PullRequest
0 голосов
/ 19 сентября 2019

Это мой старый пользовательский 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

Я проверил общий размер изображения через несколько точек:

  • 380M послеphp: 7.2-apache
  • 408M после git unzip openssh-client
  • 408M после sudo
  • 962M после libghc-zlib-dev -> это плюс 554M
  • 962M после libzip-dev
  • 1.1G после libxml2-dev -> это плюс 200M
  • 1.1G после libpng-dev
  • 1.11G ИТОГО в конце

Как я вижу, они занимают большую часть пространства: libghc-zlib-dev, libxml2-dev.

  • Есть ли более тонкое решение для этого?
  • Можно ли удалить что-то, что нужно только во время сборки?
  • Можно ли заменить их чем-то меньшим?
  • Действительно ли мне нужен пакет 500M (libghc-zlib-dev) длячитать файлы .xlsx с помощью phpoffice / phpspreadsheet?

EDIT:

Я провел некоторые эксперименты после комментариев @ Jakumi, и в результате я удалилlibghc-zlib-dev и добавили zlib1g-dev, и все же, кажется, все работает, в то время как размер изображения упал с 1.11G до 542M

Некоторые полезные ссылки, которые я нашел во время эксперимента:

1 Ответ

0 голосов
/ 20 сентября 2019

скрипт, который вы запускаете, выглядит так, как будто на месте скомпилировано много вещей.

Я не совсем уверен, действительно ли это намеренно с вашей стороны.не пытаясь обидеть, но я предполагаю, что сценарий либо скопирован, либо вы унаследовали его.

Для простоты мой подход состоял бы в том, чтобы не компилировать вещи в контейнере докера, если это действительно не выгодно / необходимо, ив некоторой степени доверяя менеджеру системы.

например: функции zip предоставляются в пакете php-zip, уже скомпилированном для использования в качестве модуля в php.Функции xml предоставляются в пакете php-xml, а также уже скомпилированы.аналогично для многих других пакетов.(Я не знаю, будет ли установка этих пакетов автоматически включать их, я не удивлюсь, так или иначе. Если, однако, они не включены по умолчанию, вам придется написать сценарий, который их разрешает ... но я 'Я вполне уверен, вы можете найти учебники или что-то).Скомпилированные библиотеки намного меньше, чем библиотеки плюс их исходный код (и исходный код скомпилированного в зависимостях).

, так как я не знаю ваш точный проект, может быть, для этого нужно по какой-то причине все это скомпилироватьможет быть, это получить последний процент (или двадцать ...) производительности, поэтому у всех строк в этом скрипте может быть очень веская причина.

Итак, в конце концов, все сводится к методу проб и ошибок.

, чтобы ответить на ваши вопросы:

  • Есть ли более тонкое решение для этого?

, скорее всего, с использованием предварительно скомпилированногоstuff

  • Можно ли удалить то, что нужно только во время сборки?

скорее всего, вам теоретически нужны только скомпилированные библиотеки

  • Могу ли я заменить их на что-то меньшее?

см. Выше, но может иметь непредвиденные последствия.если вы заботитесь о производительности, сравните производительность с оригинальной и предварительно скомпилированной версией.для проверки правильности (если вы сомневаетесь в этом) отправьте все запросы как в исходную, так и в предварительно скомпилированную версию и проверьте идентичность выходных данных.

  • Действительно ли мне нужен пакет 500M (libghc-zlib-dev) читать файлы .xlsx с помощью phpoffice / phpspreadsheet?

вероятно, не

В целом: использование предварительно скомпилированных библиотек может оказать (отрицательное) влияние на производительность,Вы можете собрать вещи, которые вам не нужны.Однако я не ожидал, что выигрыш в производительности стоил бы времени, и я использовал только скомпилированные библиотеки.(Вверху: вы также можете выбрать другое изображение докера - может быть, даже альпийское - которое вообще не нуждается в компиляции и уже имеет большую часть предварительно установленного программного обеспечения и может быть еще меньше - с учетом предполагаемого Исходный докер, который вы расширяете, библиотеки, которые вы добавляете, могут быть уже скомпилированы, и вы просто перекомпилируете их ...)

Это, очевидно, взвешенный ответ.Конечно, есть те, кто любит собирать вещи самостоятельно, и для этого могут быть очень веские причины.

...