PHP7 не может загрузить memcached и перенаправить на док-контейнер Alpine

Я пытаюсь создать образ 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?

1

Решение

Все эти расширения доступны в репозиториях 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.

3

Другие решения

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+

И не забудьте включить ваши пакеты

1

Мы столкнулись с похожими проблемами с «официальными» изображениями 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, как вы упомянули.

0