我该如何在Docker的PHP7 Alpine镜像上安装php memcached扩展?

12

官方的php7 docker镜像有以下示例:

FROM php:7.0-fpm
RUN apt-get update && apt-get install -y libmemcached-dev \
    && pecl install memcached \
    && docker-php-ext-enable memcached

我尝试使用 FROM php:7.0-fpm-alpine

RUN apk add --update --no-cache libmemcached-dev
RUN      pecl install memcached && docker-php-ext-enable memcached

PECL提示如下错误:

pecl/memcached需要PHP(版本>=5.2.0,版本<=6.0.0,排除版本:6.0.0),已安装版本为7.0.13

我该如何在alpine上安装memcached php扩展?


我相信我已经想通了,确认它能够正常工作并有时间更新后,会发布说明。 - timetofly
3个回答

30

目前,php-memcached-dev:php7 分支包含此扩展的源代码。

要安装它,您仍然可以使用 docker-php-ext-* 命令,但需要自己检出源代码。

基础安装

假设已经安装了安装该扩展所需的所有内容,则可以执行以下操作:

RUN git clone -b php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached \
    && docker-php-ext-configure /usr/src/php/ext/memcached \
        --disable-memcached-sasl \
    && docker-php-ext-install /usr/src/php/ext/memcached \
    && rm -rf /usr/src/php/ext/memcached

这个代码块将克隆存储库,配置和安装扩展,然后自我清理。

先决条件

构建扩展最可能需要安装两个包,我们可以通过以下方式添加和删除它们:

ENV MEMCACHED_DEPS zlib-dev libmemcached-dev cyrus-sasl-dev git
RUN set -xe \
    && apk add --no-cache libmemcached-libs zlib \
    && apk add --no-cache \
        --virtual .memcached-deps \
        $MEMCACHED_DEPS \
    && git clone -b php7 https://github.com/php-memcached-dev/php-memcached /usr/src/php/ext/memcached \
    && docker-php-ext-configure /usr/src/php/ext/memcached \
        --disable-memcached-sasl \
    && docker-php-ext-install /usr/src/php/ext/memcached \
    && rm -rf /usr/src/php/ext/memcached \
    && apk del .memcached-deps

更新于2017年5月17日

现在memcached已经被加入到官方的PHP扩展库中,供php7使用(v3 -> php7/7.1, v2 -> php5)

这使得安装过程有点不同了

FROM php:7.0-alpine

ENV MEMCACHED_DEPS zlib-dev libmemcached-dev cyrus-sasl-dev
RUN apk add --no-cache --update libmemcached-libs zlib
RUN set -xe \
    && apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS \
    && apk add --no-cache --update --virtual .memcached-deps $MEMCACHED_DEPS \
    && pecl install memcached \
    && echo "extension=memcached.so" > /usr/local/etc/php/conf.d/20_memcached.ini \
    && rm -rf /usr/share/php7 \
    && rm -rf /tmp/* \
    && apk del .memcached-deps .phpize-deps

我已经花了几个小时来安装php memcached。您提供的步骤没有出现任何错误,但是在安装后,我遇到了以下错误; PHP启动:无法加载动态库'/usr/local/lib/php/extensions/no-debug-non-zts-20160303/memcached.so' - 加载共享库libmemcached.so.11时出错:没有这样的文件或目录(需要/usr/local/lib/php/extensions/no-debug-non-zts-20160303/memcached.so)在未知的第0行。我该如何解决这个问题? - Odyssee
3
问题在于libmemcached-dev被添加为虚拟依赖项,然后被删除。 您需要单独添加libmemcached库。 因此,请在set -xe下方添加apk add --update libmemcached。@harry-bragg请更新您的答案。对我非常有帮助。 - Ololo
自从我发表这篇文章以来,有些事情已经改变了,我会更新一下我目前的做法。 - Harry Bragg
@HarryBragg,set -xe是用来干什么的? - Sebastian
1
@Sebastian 或许有点晚了,但是... "-x 打印简单命令的跟踪信息。-e 如果一个命令返回非零状态,则立即退出。" 另请参阅 manpage。对于大多数这些内容,您可以通过谷歌搜索“man <要了解更多信息的命令>”来获取。甚至在 Unix 系统的 shell/cli 中只需执行 'man <command>' 即可获取相关信息。 - sg3s
@HarryBragg 我看到包名上有 -dev 后缀? zlib-dev libmemcached-dev cyrus-sasl-dev。我猜这是开发版而不是稳定版的包,是这样吗? - 112Legion

24

试一下。

FROM php:7.2.10-fpm-alpine3.7


# Install PHP Extensions (igbinary & memcached)
RUN apk add --no-cache --update libmemcached-libs zlib
RUN set -xe && \
    cd /tmp/ && \
    apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS && \
    apk add --no-cache --update --virtual .memcached-deps zlib-dev libmemcached-dev cyrus-sasl-dev && \
# Install igbinary (memcached's deps)
    pecl install igbinary && \
# Install memcached
    ( \
        pecl install --nobuild memcached && \
        cd "$(pecl config-get temp_dir)/memcached" && \
        phpize && \
        ./configure --enable-memcached-igbinary && \
        make -j$(nproc) && \
        make install && \
        cd /tmp/ \
    ) && \
# Enable PHP extensions
    docker-php-ext-enable igbinary memcached && \
    rm -rf /tmp/* && \
    apk del .memcached-deps .phpize-deps

1
太棒了!仍然在2021年工作,解决了我的问题。非常感谢! - Honk der Hase

3

这对我在Debian 11上有效。

FROM php:7.4.28-apache
RUN apt-get install -y libz-dev libmemcached-dev && \
    apt-get install -y memcached libmemcached-tools && \
    pecl install memcached && \
    docker-php-ext-enable memcached

你可以使用以下命令启动守护进程:
/etc/init.d/memcached start

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接