簡體   English   中英

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 ),並安裝了一些模塊( memcachedmongodboauthopensslredis )。

我通過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

大多數模塊都可以正確安裝,但是memcachedredis不想一起玩:

# 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上可能存在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。

PHP 7.2及更高版本均基於Alpine3.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+的擴展

並且不要忘記包括您的包裹

我們在Alpine上構建的“官方” PHP映像也面臨着類似的問題。 就是 我們不可能在基於Alpine 3.4的PHP 7.1中安裝有效的ImageMagick版本

我們所做的是從Alpine 3.6安裝它 ,而實際上我不建議這樣做,這可能是一種解決方法。

另一個解決方法是等待在Alpine 3.6上構建的PHP 7.2。 可以選擇查找有效的PHP + Alpine組合,因為您是FROM alpine而不是FROM php:alpine構建的

只是說:諸如此類的問題使我們回到Debian圖像上,因為我們在此上浪費了很多時間,包括您提到的怪異的glibc問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM