Я пытаюсь создать образ Docker на основе Alpine Linux, который будет работать на PHP 7.1 (apk add php7=7.1.9-r0
) с некоторыми установленными модулями (memcached
, mongodb
, oauth
, openssl
а также redis
).
Я устанавливаю модули через PECL следующим образом:
RUN yes | pecl install \
igbinary \
redis-3.1.4 \
oauth-2.0.2 \
memcached-3.0.4 \
mongodb-1.3.3
Затем добавьте каждый из них в php.ini
,
RUN for EXT in \
igbinary \
memcached \
mongodb \
oauth \
openssl \
redis; \
do \
echo "extension=${EXT}.so" >> /etc/php7/php.ini; \
done
Большинство модулей установлены правильно, но memcached
а также redis
не хочу подыгрывать
# php -v
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php7/modules/memcached.so' - Error relocating /usr/lib/php7/modules/memcached.so: php_session_create_id: symbol not found in Unknown on line 0
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php7/modules/redis.so' - Error relocating /usr/lib/php7/modules/redis.so: php_session_register_module: symbol not found in Unknown on line 0
PHP Warning: Module 'openssl' already loaded in Unknown on line 0
PHP Warning: Cannot load module 'mongodb' because required module 'json' is not loaded in Unknown on line 0
PHP 7.1.9 (cli) (built: Oct 2 2017 20:51:54) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
Я также попробовал из источника:
RUN git clone https://github.com/php-memcached-dev/php-memcached
RUN cd php-memcached \
&& git checkout php7 \
&& git pull \
&& /usr/bin/phpize \
&& ./configure --with-php-config=/usr/bin/php-config \
&& make \
&& make install
Это однако дает мне тот же результат. Я провел некоторые поиски, и, видимо, могут быть некоторые связанные проблемы glibc
на альпийском (пример темы) но я не совсем уверен, что это та же проблема, что вывод ошибок немного сбивает с толку.
Есть ли что-то, что я упускаю из виду, как эти модули должны быть установлены для работы с PHP 7.1 в Alpine Linux?
Все эти расширения доступны в репозиториях Alpine, так почему же вы усложняете свою жизнь и устанавливаете их непосредственно из PECL? Установите их просто используя apk
,
Обратите внимание, что эти пакеты в Alpine v3.7 (последний стабильный выпуск), я не проверял, доступны ли они также в более старых выпусках.
Эти пакеты, конечно, устанавливают файлы конфигурации с extension=<ext>.so
так что не добавляйте его вручную в php.ini
,
apk add php7=7.1.9-r0
Почему вы указываете точную версию? Это не удастся, как только мы обновим пакет (например, с исправлениями безопасности), потому что в репозиториях доступна только самая последняя версия пакетов. В стабильные выпуски мы переносим только исправления безопасности и исправления ошибок (то есть версии исправлений), поэтому в v3.6 или v3.7 не будет 7.2.x.
PHP 7.2 и более поздние версии основаны на Alpine 3.7, который имеет все необходимые расширения, доступные в хранилище.
Однако есть PHP 7.1 и PHP 7.0, которые все еще основаны на 3.4, но не имеют никаких расширений php7- *.
Обходной путь — установить pecl, который, в свою очередь, может установить все необходимые расширения.
Вы можете достичь этого следующим образом:
RUN apk update\
&& apk upgrade \
&& apk add libmemcached \
libmemcached-libs \
libmemcached-dev \
build-base \
zlib-dev \
php5-dev \
git \
autoconf \
cyrus-sasl-dev \
&& pecl config-set php_ini /usr/local/etc/php/php.ini \
&& pecl install -f memcached \ #Add any Additional packages
&& echo extension=memcached.so >> /usr/local/etc/php/conf.d/docker-php-ext-memcached.ini \
&& rm -rf /tmp/pear \
&& apk del php5-dev \
build-base \
zlib-dev \
php5-dev \
git \
autoconf \
cyrus-sasl-dev
Это установит PECL с php5, который отлично работает для установки расширений для PHP 7+
И не забудьте включить ваши пакеты
Мы столкнулись с похожими проблемами с «официальными» изображениями PHP, созданными на Alpine. То есть. нам было невозможно установить рабочую версию ImageMagick в PHP 7.1, основанную на Alpine 3.4
Что мы сделали установка его из Alpine 3.6, хотя я на самом деле не рекомендую это, это может быть обходной путь.
Другой обходной путь — дождаться PHP 7.2, который построен на Alpine 3.6. Может быть вариант искать рабочую комбинацию PHP + Alpine, так как вы строите FROM alpine
и не FROM php:alpine
Просто сказать: подобные проблемы заставили нас вернуться к образам Debian, так как мы потратили на это сотни часов, включая такие странные проблемы с glibc, как вы упомянули.