Добавление PHP-расширений в Docker-образы

Раздел: Расширения PHP -> Управление расширениями PHP

Управление расширениями 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, а также не забывать о системных библиотеках во время выполнения.

Расширение PHP в Docker - comments

En
Docker php ext (php)