Добавление PHP-расширений в Docker-образы
Управление расширениями PHP в Docker
Как быстро и надежно установить расширение PHP в Docker-образ на основе официального образа PHP?
Наиболее эффективный способ установки расширений PHP в Docker - использование встроенных скриптов docker-php-ext-install, docker-php-ext-configure и docker-php-ext-enable, которые предоставляются официальными образами PHP. Эти скрипты автоматизируют процесс загрузки, компиляции (если необходимо) и включения расширения в файл php.ini.
# Пример Dockerfile
FROM php:8.2-fpm
# Установка системных зависимостей
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
&& rm -rf /var/lib/apt/lists/*
# Настройка и установка расширения GD
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd
# Установка pdo_mysql
RUN docker-php-ext-install pdo_mysql
# Включение расширения (необязательно, install уже включает)
RUN docker-php-ext-enable gd pdo_mysql
Docker php ext (расширение php в docker)
Пояснение шагов:
docker-php-ext-configureзадает дополнительные опции компиляции (например, указание путей к библиотекам).docker-php-ext-installзагружает исходники, компилирует и устанавливает расширение в /usr/local/lib/php/extensions/.docker-php-ext-enableсоздает файл .ini в /usr/local/etc/php/conf.d/ для автоматической загрузки.
Типичные проблемы и решения:
- Расширение не найдено: убедитесь, что название расширения совпадает с именем в папке /usr/src/php/ext/. Например, для bcmath нужно указывать
bcmath. - Ошибка компиляции: обычно не хватает системных зависимостей. Установите их через apt-get перед запуском install. Например, для gd нужны libpng-dev, libjpeg-dev, libfreetype6-dev.
- Расширение уже есть: если расширение встроено в PHP (например, mbstring), его не нужно устанавливать отдельно. Проверьте через php -m.
Как установить расширения, отсутствующие в списке docker-php-ext-install (например, redis, xdebug)?
Для расширений, которые не входят в стандартный набор исходников PHP, используется pecl. В официальном образе PHP доступен скрипт docker-php-pecl-install, который оборачивает вызов pecl install и автоматически включает расширение.
FROM php:8.2-cli
# Установка зависимостей для pecl (git, zip)
RUN apt-get update && apt-get install -y git zip unzip \
&& rm -rf /var/lib/apt/lists/*
# Установка redis
RUN docker-php-pecl-install redis-5.3.7
# Установка xdebug
RUN docker-php-pecl-install xdebug-3.2.0
# Включение расширения (делается автоматически, но можно явно)
RUN docker-php-ext-enable redis xdebug
Ext http php (расширение http для php)
Типичные проблемы:
- Ошибка подключения к pecl.php.net: проверьте сетевые настройки контейнера, используйте зеркало или установка из исходников.
- Версия расширения не совместима с версией PHP: уточните номер подходящей версии на pecl.php.net или используйте
pecl install redisдля выбора стабильной версии. - Требуются дополнительные заголовочные файлы: установите пакеты типа
libz-devдля redis.
Как установить расширение, если оно доступно в виде системного пакета (например, php-mysql)?
Некоторые расширения можно установить через менеджер пакетов дистрибутива, например, apt-get для Debian/Ubuntu. Этот способ удобен, если расширение уже скомпилировано для вашей версии PHP. Однако следует использовать репозиторий sury.org для соответствия версии PHP.
FROM php:8.2-fpm
# Добавление репозитория sury.org (если используется Debian)
RUN apt-get update && apt-get install -y apt-transport-https lsb-release ca-certificates wget \
&& wget -qO- https://packages.sury.org/php/apt.gpg | apt-key add - \
&& echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list \
&& apt-get update
# Установка расширения из пакета (например, php-xml)
RUN apt-get install -y php8.2-xml
# Активация через docker-php-ext-enable (если пакет не включает ini)
RUN docker-php-ext-enable xml
Off php ext (отключение расширения php)
Типичные проблемы:
- Версия PHP в репозитории не совпадает с версией образа: используйте sury.org, который поддерживает несколько версий.
- Конфликт пакетов: не устанавливайте php8.2-xml, если xml уже встроен или установлен другим способом. Проверьте список через
dpkg -l | grep php. - Расширение не загружается: после установки пакета может потребоваться включить его в php.ini. Используйте docker-php-ext-enable или создайте файл в conf.d.
Как собрать расширение с нестандартными опциями компиляции (например, указать кастомные пути)?
Расширения, доступные на GitHub или других источниках, можно скачать, скомпилировать вручную с помощью phpize и configure. Затем установить через make install и включить через docker-php-ext-enable.
FROM php:8.2-cli
# Установка зависимостей для сборки
RUN apt-get update && apt-get install -y git autoconf libtool make gcc \
&& rm -rf /var/lib/apt/lists/*
# Клонирование исходников расширения (например, php-memcached)
RUN git clone https://github.com/php-memcached-dev/php-memcached.git /tmp/php-memcached
WORKDIR /tmp/php-memcached
# Запуск phpize и configure
RUN phpize && ./configure --with-libmemcached-dir=/usr --enable-memcached
# Компиляция и установка
RUN make && make install
# Включение расширения
RUN docker-php-ext-enable memcached
# Очистка
RUN rm -rf /tmp/php-memcached
Ext php install (установка расширения php)
Типичные проблемы:
- Ошибка phpize: убедитесь, что установлен пакет php-dev (входит в образ PHP).
- Не найдены заголовочные файлы: установите системные зависимости, например, libmemcached-dev.
- Сборка прерывается из-за ошибок: проверьте логи configure и make. Иногда нужны дополнительные флаги.
Как минимизировать размер образа, если для компиляции расширения требуются объемные зависимости?
Многостадийная сборка позволяет собрать расширение в одном контейнере, а затем скопировать только скомпилированный .so файл в финальный минимальный образ. Это уменьшает итоговый размер, так как инструменты компиляции не попадают в финальный образ.
# Стадия сборки
FROM php:8.2-cli AS builder
RUN apt-get update && apt-get install -y libmagickwand-dev libpng-dev libjpeg-dev \
&& rm -rf /var/lib/apt/lists/*
# Сборка imagick из исходников
RUN git clone https://github.com/Imagick/imagick /tmp/imagick
WORKDIR /tmp/imagick
RUN phpize && ./configure && make && make install
# Финальный образ
FROM php:8.2-fpm
# Копирование только .so файла
COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20220829/imagick.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/
# Включение расширения
RUN docker-php-ext-enable imagick
Типичные проблемы:
- Путь к .so файлу отличается: определите точный путь с помощью
php -i | grep extension_dirв builder stage. - Несовместимость сборки: используйте ту же версию PHP в обеих стадиях, чтобы ABI совпадал.
- Расширение зависит от системных библиотек (libmagickwand): в финальный образ также нужно установить рантайм-зависимости (например, libmagickwand-6.q16-6).
Расширенные примеры использования
Пример 1: Комбинированный Dockerfile с установкой pdo_mysql, redis, gd через разные методы.
FROM php:8.2-fpm AS base
# Системные зависимости для GD и Redis
RUN apt-get update && apt-get install -y \
libpng-dev libjpeg-dev libfreetype6-dev \
git zip unzip \
&& rm -rf /var/lib/apt/lists/*
# Настройка GD
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd \
&& docker-php-ext-install pdo_mysql
# Установка Redis через pecl
RUN docker-php-pecl-install redis-5.3.7
# Включение
RUN docker-php-ext-enable gd pdo_mysql redis
# Проверка
RUN php -m | grep -E 'gd|pdo_mysql|redis'
gd pdo_mysql redis
Пример 2: Установка Xdebug с настройкой параметров.
FROM php:8.2-cli
RUN docker-php-pecl-install xdebug-3.2.0
# Создание ini-файла с конфигурацией
RUN echo "zend_extension=xdebug" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \
&& echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN php -v | grep Xdebug
PHP 8.2.12 (cli) (built: Oct 20 2023 08:31:24) ( NTS )
Copyright (c) 1997-2023 The PHP Group
Zend Engine v4.2.12, Copyright (c) 1998-2023 Zend Technologies
with Xdebug v3.2.0, Copyright (c) 2002-2023, by Derick Rethans
Пример 3: Сборка расширения Swoole из исходников с кастомными опциями.
FROM php:8.2-cli AS builder
RUN apt-get update && apt-get install -y git autoconf libtool make gcc \
&& rm -rf /var/lib/apt/lists/*
RUN git clone --depth=1 https://github.com/swoole/swoole-src.git /tmp/swoole
WORKDIR /tmp/swoole
RUN phpize && ./configure --enable-openssl --enable-http2 --enable-sockets
RUN make && make install
RUN docker-php-ext-enable swoole
# Проверка
RUN php -r "echo Swoole\VERSION;"
5.1.0
Пример 4: Многостадийная сборка для расширения mongodb с копированием зависимостей.
# Builder stage
FROM php:8.2-cli AS builder
RUN apt-get update && apt-get install -y libssl-dev libcurl4-openssl-dev pkg-config \
&& rm -rf /var/lib/apt/lists/*
RUN pecl install mongodb-1.15.0
# Запись пути к .so
RUN php -i | grep extension_dir >> /tmp/extension_dir
# Final stage
FROM php:8.2-fpm
RUN apt-get update && apt-get install -y libssl1.1 curl \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20220829/mongodb.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/
RUN docker-php-ext-enable mongodb
RUN php -m | grep mongodb
mongodb
В каждом примере продемонстрированы различные аспекты: установка зависимостей, настройка опций компиляции, проверка работоспособности. Для успешного использования важно сопоставлять версии расширений и PHP, а также не забывать о системных библиотеках во время выполнения.