PHP7 无法在 Alpine docker 容器上加载 memcached 和 redis
PHP7 fails to load memcached and redis on Alpine docker container
我正在尝试创建一个基于 Alpine Linux 的 Docker 映像,它将 运行 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
然而,这给了我相同的结果。我做了一些搜索,显然在 Alpine (example thread) 上可能存在一些与 glibc
相关的问题,但我不太确定这是同一个问题,因为错误输出有点令人困惑。
关于如何安装这些模块以在 Alpine Linux 上与 PHP 7.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
我们在 Alpine 上构建的 "official" PHP 映像遇到了类似的问题。 IE。我们不可能在基于 Alpine 3.4
的 PHP 7.1 中安装有效的 ImageMagick 版本
我们所做的是 installing it from Alpine 3.6,虽然我实际上不推荐这样做,但它可能是一种解决方法。
另一个解决方法是等待 PHP 7.2,它是在 Alpine 3.6 上构建的。可能是寻找有效的 PHP + Alpine 组合的一种选择,因为您正在构建 FROM alpine
而不是 FROM php:alpine
只是说:像这样的问题让我们回到了 Debian 映像,因为我们已经在这上面浪费了大量时间,包括你提到的奇怪的 glibc 问题。
PHP 7.2 及更高版本基于 Alpine 3.7,它在存储库中提供了所有必要的扩展。
然而,PHP 7.1 和 PHP 7.0 仍然基于没有任何 php7-* 扩展的 3.4。
解决方法是安装 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
这将安装带有 php5 的 PECL,它可以完美地安装 PHP 7+
的扩展
别忘了附上你的包裹
我正在尝试创建一个基于 Alpine Linux 的 Docker 映像,它将 运行 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
然而,这给了我相同的结果。我做了一些搜索,显然在 Alpine (example thread) 上可能存在一些与 glibc
相关的问题,但我不太确定这是同一个问题,因为错误输出有点令人困惑。
关于如何安装这些模块以在 Alpine Linux 上与 PHP 7.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我们在 Alpine 上构建的 "official" PHP 映像遇到了类似的问题。 IE。我们不可能在基于 Alpine 3.4
的 PHP 7.1 中安装有效的 ImageMagick 版本我们所做的是 installing it from Alpine 3.6,虽然我实际上不推荐这样做,但它可能是一种解决方法。
另一个解决方法是等待 PHP 7.2,它是在 Alpine 3.6 上构建的。可能是寻找有效的 PHP + Alpine 组合的一种选择,因为您正在构建 FROM alpine
而不是 FROM php:alpine
只是说:像这样的问题让我们回到了 Debian 映像,因为我们已经在这上面浪费了大量时间,包括你提到的奇怪的 glibc 问题。
PHP 7.2 及更高版本基于 Alpine 3.7,它在存储库中提供了所有必要的扩展。 然而,PHP 7.1 和 PHP 7.0 仍然基于没有任何 php7-* 扩展的 3.4。
解决方法是安装 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
这将安装带有 php5 的 PECL,它可以完美地安装 PHP 7+
的扩展别忘了附上你的包裹