PHP-расширения в Docker без боли — обзор `docker-php-extension-installer`
Привет, коллеги! Знакомая ситуация: вы добавляете в проект обработку изображений, и вам нужно расширение gd. Вы открываете Dockerfile и начинается... apt-get update, apt-get install libpng-dev libjpeg-dev, затем docker-php-ext-configure gd --with..., docker-php-ext-install gd, и, наконец, apt-get purge ... && rm -rf /var/lib/apt/lists/*, чтобы образ не раздулся до гигантских размеров. А если расширений пять? А если нужно подбирать зависимости под Alpine, а не Debian?
Этот ритуал знаком каждому PHP-разработчику, работающему с Docker. Он отнимает время, делает Dockerfile громоздким и сложным для чтения. Но, к счастью, я наткнулся на проект, который решает эту проблему раз и навсегда. Встречайте — mlocati/docker-php-extension-installer, настоящий швейцарский нож для работы с PHP-расширениями в Docker.
Что это такое и зачем нужно?
docker-php-extension-installer — это один-единственный shell-скрипт, который превращает многострочные заклинания в Dockerfile в одну простую команду. Он сам определяет, какой дистрибутив используется в базовом образе (Debian или Alpine), находит, устанавливает и настраивает все необходимые системные зависимости, компилирует расширение и, что самое важное, подчищает за собой весь мусор.
Говоря простыми словами, это пакетный менеджер для PHP-расширений внутри Docker. Вместо того чтобы вручную искать нужные -dev пакеты, вы просто говорите: "дай мне gd и xdebug", и скрипт делает всю грязную работу за вас.
Как это меняет жизнь?
Давайте посмотрим на магию в действии. Вот типичный способ установки gd и xdebug вручную:
# Старый способ
FROM php:8.2-cli
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) gd \
&& pecl install xdebug \
&& docker-php-ext-enable xdebug \
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
&& rm -rf /var/lib/apt/lists/*
А теперь то же самое с docker-php-extension-installer:
# Новый способ
FROM php:8.2-cli
ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN install-php-extensions gd xdebug
Разница, как говорится, налицо. Dockerfile становится чище, короче и понятнее. Больше не нужно быть экспертом по apt или apk, чтобы собрать кастомный образ.
Ключевые возможности, которые цепляют
Этот инструмент — не просто обертка над pecl install. В нем есть несколько очень продуманных фич.
1. Управление версиями в стиле Composer
Одна из моих любимых возможностей — синтаксис для указания версий. Хотите конкретную версию xdebug? Пожалуйста:
# Установить xdebug версии 2.9.7
install-php-extensions xdebug-2.9.7
А что если нужна последняя стабильная версия из второй ветки? И это возможно, прямо как в composer.json:
# Установить самую свежую версию xdebug 2.x (например, 2.9.8)
install-php-extensions xdebug-^2
# Установить последнюю СТАБИЛЬНУЮ версию из 3-й ветки
install-php-extensions xdebug-^3@stable
Такой подход сильно упрощает поддержку Dockerfile в долгосрочной перспективе, позволяя легко обновлять версии или фиксировать их при необходимости.
2. Установка прямо из Git
Иногда нужно протестировать расширение из определенной ветки или даже форка. Скрипт позволяет устанавливать расширения напрямую из исходников на GitHub.
# Установить из ветки master
install-php-extensions php-memcached-dev/php-memcached@master
# Установить из конкретного коммита
install-php-extensions php-memcached-dev/php-memcached@8f106564e6bb
Это невероятно удобно для тестирования pull-request'ов или использования кастомных версий расширений без необходимости публиковать их в PECL.
3. Не только расширения
Автор пошел дальше и добавил в скрипт несколько полезных "утилит". Например, можно одной командой установить Composer:
# Установить последнюю версию Composer
install-php-extensions @composer
# Установить последнюю версию Composer 1.x
install-php-extensions @composer-1
А еще есть полезный фикс для старых дистрибутивов, которые столкнулись с проблемой истекшего корневого сертификата Let's Encrypt. Если ваш образ на старом Debian или Alpine не может достучаться до репозиториев по HTTPS, просто добавьте @fix_letsencrypt:
install-php-extensions @fix_letsencrypt gd redis
4. Огромная база знаний
Скрипт поддерживает более 150 расширений для разных версий PHP, от 5.5 до 8.5. В репозитории есть огромная таблица совместимости, которая постоянно обновляется. Это результат колоссальной работы по сбору информации о зависимостях каждого расширения на разных версиях Debian и Alpine. По сути, автор собрал и автоматизировал знания, которые мы обычно по крупицам ищем на Stack Overflow.
Как это использовать?
В README проекта описано несколько способов интеграции скрипта в ваш Dockerfile. Самый простой и наглядный, на мой взгляд, — это использование ADD:
FROM php:8.4-cli
# Скачиваем скрипт и делаем его исполняемым
ADD --chmod=0755 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
# Используем!
RUN install-php-extensions gd redis xdebug zip
Другой элегантный способ — скопировать скрипт из уже готового Docker-образа. Это ускоряет сборку, так как не требует скачивания из интернета:
FROM php:8.4-cli
# Копируем скрипт из официального образа утилиты
COPY --from=ghcr.io/mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/
RUN install-php-extensions gd redis xdebug zip
Выводы: кому это точно пригодится?
docker-php-extension-installer — это тот тип инструмента, который, однажды попробовав, вы будете добавлять в каждый свой новый проект.
Он идеально подойдет, если вы:
- PHP-разработчик, использующий Docker. Это очевидно. Инструмент сэкономит вам часы времени и сотни строк в Dockerfile.
- Поддерживаете несколько проектов с разными наборами PHP-расширений. Скрипт унифицирует и упрощает процесс сборки образов.
- Работаете в команде. Чистые и лаконичные
Dockerfileлегче читать и поддерживать всем членам команды. - Часто экспериментируете с новыми расширениями или их версиями.
Это блестящий пример того, как один человек может решить общую проблему для всего сообщества, создав простой, но невероятно эффективный инструмент. Настоятельно рекомендую заглянуть на GitHub, поставить звезду и попробовать его в деле. Уверен, вы не пожалеете.