How to install php-redis extension using the official PHP Docker image approach?

PhpRedisDockerDockerfile

Php Problem Overview


I want to build my PHP-FPM image with php-redis extension based on the official PHP Docker image, for example, using this Dockerfile: php:5.6-fpm.

The docs say that I can install extensions this way, installing dependencies for extensions manually:

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"]

Without Docker I installed it with apt-get install php5-redis. But how can I install it using the approach above?

Php Solutions


Solution 1 - Php

Redis is not an extension that is included in “php-src”, therefore you cannot use docker-php-ext-install. Use PECL:

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

On alpine php 7.3.5 we can use:

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

Solution 2 - Php

My opinion, the easiest way is:

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

;)

Solution 3 - Php

Slightly revised version of starikovs and skyred answers for the current PHP 7 version of the docker image (tested on php:7.0.8-fpm-alpine and php:7.0.8-alpine).

Uses the newly released 3.0 version (June 2016) for PHP 7.

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

Solution 4 - Php

I've found two ways to install php-redis extension for official php-fpm Docker image. Here they are:

The first way is to compile redis from sources and install.

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 script is included in php-fpm image and can compile extensions and install them.

The second way you can do it is with PECL.

As TimWolla answered, you can do it with PECL, but in my case, PECL isn't installed by default.

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

Solution 5 - Php

Based on @starikovs answer. I added a variable for docker style.

# 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

Solution 6 - Php

If you want to use redis as session handler;

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

If you want to use redis extension with PHP 7 in 2015 (borrowed from skyred's answer);

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

Solution 7 - Php

This works for alpine images:

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

Edit: Added missing backslash

Solution 8 - Php

Tried few ways. On alpine php 7.3.5 we can use:

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

Solution 9 - Php

I'm using combination of PECL and PHP official docker extension script

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

For PHP7 you need to wait for official redis pecl release or use 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

Solution 10 - Php

Slightly revised version of starikovs and skyred answers for current version of the docker image. Tested on 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

Solution 11 - Php

In your Dockerfile you can clone the repo and install it with:

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

Solution 12 - Php

For image php:7.2-fpm-alpine.

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

You may need to update before

apk --update upgrade

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionstarikovsView Question on Stackoverflow
Solution 1 - PhpTimWollaView Answer on Stackoverflow
Solution 2 - PhpPavelView Answer on Stackoverflow
Solution 3 - PhpotherguyView Answer on Stackoverflow
Solution 4 - PhpstarikovsView Answer on Stackoverflow
Solution 5 - PhpskyredView Answer on Stackoverflow
Solution 6 - PhpmasakielasticView Answer on Stackoverflow
Solution 7 - PhpgrogowarView Answer on Stackoverflow
Solution 8 - PhpmihnsenView Answer on Stackoverflow
Solution 9 - Phpisp_developerView Answer on Stackoverflow
Solution 10 - Phpselim13View Answer on Stackoverflow
Solution 11 - PhpazuaxView Answer on Stackoverflow
Solution 12 - PhpGabriel NovaesView Answer on Stackoverflow