PHP7无法在Alpine docker容器上加载memcached和redis

时间:2017-12-01 09:55:52

标签: php docker memcached php-7 alpine

我试图创建一个基于Alpine Linux的Docker镜像,它运行PHP 7.1(apk add php7=7.1.9-r0)并安装了一些模块(memcachedmongodb,{{1 }},oauthopenssl)。

我通过PECL安装模块,如下所示:

redis

然后将其中的每一个添加到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

然而,这给了我相同的结果。我已经做了一些搜索,显然在Alpine(example thread)上可能存在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 Linux上使用PHP 7.1安装这些模块,有什么我可以忽略的吗?

3 个答案:

答案 0 :(得分:3)

所有这些扩展都可以在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。

答案 1 :(得分:1)

PHP 7.2及以后版本基于Alpine 3.7 Wich在存储库中提供了所有必要的扩展。 然而,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

这将安装带有php5的PECL,它非常适合安装PHP 7 +的扩展

不要忘记包含你的包

答案 2 :(得分:0)

我们在使用Alpine构建的“官方”PHP图像时面临着类似的问题。 IE浏览器。我们不可能在PHP 7.1中安装一个基于Alpine 3.4

的工作ImageMagick版本

我们所做的是installing it from Alpine 3.6,而我实际上不会建议这可能是一种解决方法。

另一种解决方法是等待基于Alpine 3.6构建的PHP 7.2。可能是寻找有效的PHP + Alpine组合的选项,因为您正在构建FROM alpine而不是FROM php:alpine

只是说:这样的问题让我们回到了Debian图像,因为我们浪费了大量的时间,包括你提到的奇怪的glibc问题。