如何使用官方 PHP Docker 镜像方法安装 php-redis 扩展?

Posted

技术标签:

【中文标题】如何使用官方 PHP Docker 镜像方法安装 php-redis 扩展?【英文标题】:How to install php-redis extension using the official PHP Docker image approach? 【发布时间】:2015-09-30 22:05:30 【问题描述】:

我想基于official php Docker image 构建我的带有php-redis 扩展的PHP-FPM 映像,例如,使用这个Dockerfile:php:5.6-fpm。

文档说我可以通过这种方式安装扩展,手动安装扩展的依赖项:

FROM php:5.6-fpm
# Install modules (iconv, mcrypt and gd extensions)
RUN apt-get update && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng12-dev \
    && docker-php-ext-install iconv mcrypt \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install gd
CMD ["php-fpm"]

没有 Docker 我用apt-get install php5-redis 安装它。但是如何使用上面的方法安装呢?

【问题讨论】:

【参考方案1】:

Redis 不是包含在“php-src”中的扩展,因此您不能使用docker-php-ext-install。使用PECL:

RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  docker-php-ext-enable redis

在 alpine php 7.3.5 上我们可以使用:

RUN apk add --no-cache pcre-dev $PHPIZE_DEPS \
        && pecl install redis \
        && docker-php-ext-enable redis.so

【讨论】:

TimWolla,谢谢,我会试试的。那么,我需要在所有这些之前安装pecl 吗? TimWolla, pecl 默认不包括在内。 如果我想为 Redis 使用不同的图像怎么办? @IlGala 这个命令安装 php 扩展为 redis 而不是 redis 服务器本身 -o 和 -f 选项有什么作用?【参考方案2】:

我认为,最简单的方法是:

RUN pecl install redis && docker-php-ext-enable redis

;)

【讨论】:

是的,这是一个现代的答案。 效果很好!!谢谢。 不起作用。特别是 docker-php-ext-enable redis 不会在任何地方安装任何配置文件。它什么都不做。 给我错误 docker-php-ext-enable -- 未找到。你能帮忙吗? 我看到了@SzczepanHołyszewski 的评论,只是执行了第一个命令 (RUN pecl install redis),而不是两个 (RUN pecl install redis && docker-php-ext-enable redis)。这就是我所需要的一切!【参考方案3】:

针对当前 PHP 7 版本的 docker 映像(在 php:7.0.8-fpm-alpinephp:7.0.8-alpine 上测试)略微修改了 starikovs 和 skyred 答案。

为 PHP 7 使用新发布的 3.0 版本(2016 年 6 月)。

ENV PHPREDIS_VERSION 3.0.0

RUN mkdir -p /usr/src/php/ext/redis \
    && curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
    && echo 'redis' >> /usr/src/php-available-exts \
    && docker-php-ext-install redis

【讨论】:

我尝试了@starikovs 的答案,但我始终无法有效地启用扩展。这个答案第一次奏效!【参考方案4】:

我找到了两种方法来为官方php-fpm Docker image 安装php-redis 扩展。他们在这里:

第一种方法是从源码编译redis并安装。

RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/2.2.7.tar.gz \
    && tar xfz /tmp/redis.tar.gz \
    && rm -r /tmp/redis.tar.gz \
    && mv phpredis-2.2.7 /usr/src/php/ext/redis \
    && docker-php-ext-install redis

docker-php-ext-install 脚​​本包含在 php-fpm 镜像中,可以编译扩展并安装它们。

第二种方法是使用 PECL。

作为 TimWolla answered,您可以使用 PECL 进行操作,但在我的情况下,默认情况下不安装 PECL。

RUN pecl install -o -f redis \
&&  rm -rf /tmp/pear \
&&  echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini

【讨论】:

我必须在mv 之前添加一个mkdir -p /usr/src/php/ext 我使用了 pecl 但必须添加 RUN apk add --no-cache autoconf git g++ make 从这个答案:***.com/a/44191638/4018940【参考方案5】:

基于@starikovs 的回答。我为 docker 样式添加了一个变量。

# install phpredis extension
ENV PHPREDIS_VERSION 2.2.7

RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz \
    && tar xfz /tmp/redis.tar.gz \
    && rm -r /tmp/redis.tar.gz \
    && mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis \
    && docker-php-ext-install redis

【讨论】:

【参考方案6】:

如果你想使用redis作为会话处理器;

RUN  \
    echo 'session.save_handler = redis'; \
    echo 'session.save_path = tcp://redis:6379'; \
 >> /usr/local/etc/php/conf.d/docker-php-ext-redis.ini

如果你想在 2015 年将 redis 扩展与 PHP 7 一起使用(借用 skyred 的回答);

ENV PHPREDIS_VERSION php7

RUN curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz \
    && tar xfz /tmp/redis.tar.gz \
    && rm -r /tmp/redis.tar.gz \
    && mv phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis \
    && docker-php-ext-install redis

【讨论】:

【参考方案7】:

这适用于高山图像:

RUN set -xe \
    && apk add --no-cache --update --virtual .phpize-deps $PHPIZE_DEPS \
    && pecl install -o -f redis  \
    && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini \
    && rm -rf /usr/share/php \
    && rm -rf /tmp/* \
    && apk del  .phpize-deps

编辑:添加缺少的反斜杠

【讨论】:

【参考方案8】:

尝试了几种方法。在 alpine php 7.3.5 上我们可以使用:

RUN apk add --no-cache pcre-dev $PHPIZE_DEPS \
        && pecl install redis \
        && docker-php-ext-enable redis.so

【讨论】:

变量 $PHPIZE_DEPS 设置在哪里,里面应该有什么? $PHPIZE_DEPTS 由 docker alpine 设置。它用于构建 pecl 扩展,如 Redis php.net/manual/en/install.pecl.phpize.php【参考方案9】:

我正在使用 PECL 和 PHP 官方 docker 扩展脚本的组合

RUN pecl bundle -d /usr/src/php/ext redis \
&& rm /usr/src/php/ext/redis-*.tgz \
&& docker-php-ext-install redis

PHP7需要等待官方redis pecl发布或者使用git:

RUN apt-get update \
&& apt-get install git -y -q \
&& git clone -b php7 https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis \
&& docker-php-ext-install redis

【讨论】:

Redis PECL 扩展 v3 自 2016 年 6 月 10 日起可用于 PHP 7。【参考方案10】:

starikovs 和 skyred 对当前版本的 docker 映像的答案略有修改。 在 php:5-fpm-alpine 上测试

# install phpredis extension
ENV PHPREDIS_VERSION 2.2.8

ADD https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz /tmp/redis.tar.gz
RUN tar xzf /tmp/redis.tar.gz -C /tmp \
    && mkdir -p /usr/src/php/ext \
    && mv /tmp/phpredis-$PHPREDIS_VERSION /usr/src/php/ext/redis \
    && echo 'redis' >> /usr/src/php-available-exts \
    && docker-php-ext-install redis \
    && rm -rf /usr/src/php/ext/redis

【讨论】:

【参考方案11】:

在您的 Dockerfile 中,您可以克隆 repo 并安装它:

RUN git clone https://github.com/phpredis/phpredis.git /tmp/phpredis \
&& cd /tmp/phpredis \
&& git checkout -b 3.1.2 \ ## or the release you need #
&& phpize \
&& ./configure \
&& make \
&& make install

【讨论】:

【参考方案12】:

对于图像 php:7.2-fpm-alpine.

RUN apk add autoconf gcc g++ make && pecl install redis && docker-php-ext-enable redis

你可能需要更新之前

apk --update upgrade

【讨论】:

以上是关于如何使用官方 PHP Docker 镜像方法安装 php-redis 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Docker 官方镜像中添加 freetype 到 php-gd

如何在 docker php 官方镜像实例中添加 Zend Guard Loader 支持?

docker如何制作自己的镜像

docker php 镜像怎么配置

PHP项目Docker化指南

如何给Docker配置官方国内加速镜像