Search code examples
phpdockergrpc

Docker container fails to build when installing GRPC


I have a Dockerfile that when used with my docker-compose commands works fine, I'd like to have this docker container built however as GRPC takes 15 mins to install every time I want to run tests in GitHub Actions

This is what my Dockerfile currently looks like:

FROM xxx-base:6

RUN pecl install grpc \
    && docker-php-ext-enable grpc \

WORKDIR /application

And I get the following error output:

#5 580.4 g++: fatal error: Killed signal terminated program cc1plus
#5 580.4 compilation terminated.
#5 580.4 make: *** [Makefile:248: src/core/ext/filters/client_channel/lb_policy/xds/cds.lo] Error 1
#5 580.5 ERROR: `make' failed
------
executor failed running [/bin/sh -c sudo pecl install grpc     && docker-php-ext-enable grpc WORKDIR /application]: exit code: 1

It's worth mentioning in the base container used here I used pecl to install imagik so I know that command at least partially works. This is a base PHP 7.4 container.

Any suggestions, I've seen some other posts referring to the memory limit on the docker build, but I'm not sure what to change

Pastebin full stacktrace: pastebin.com/g7iZ2uRn


Solution

  • To expand on the other answers, installing the PECL package for gRPC attempts to compile the C core library (which also includes a good amount of third-party dependencies). That is done before the extension itself, and is what causes the slow build time. You can test it for yourself if you follow the steps described in the "Build from source" section in the PHP README (https://github.com/grpc/grpc/tree/master/src/php#build-from-source) - you'll notice that building C core library can take a lot of time (>10 minutes), while the extension is built pretty fast (~30 seconds).

    I followed the advice in this Github comment (https://github.com/grpc/grpc/issues/34278#issuecomment-1871059454) which applies for Docker images using Alpine:

    RUN apk add --no-cache git grpc-cpp grpc-dev $PHPIZE_DEPS && \
    GRPC_VERSION=$(apk info grpc -d | grep grpc | cut -d- -f2) && \
    git clone --depth 1 -b v${GRPC_VERSION} https://github.com/grpc/grpc /tmp/grpc && \
    cd /tmp/grpc/src/php/ext/grpc && \
    phpize && \
    ./configure && \
    make && \
    make install && \
    rm -rf /tmp/grpc && \
    apk del --no-cache git grpc-dev $PHPIZE_DEPS && \
    echo "extension=grpc.so" > /usr/local/etc/php/conf.d/grpc.ini
    

    That fetches a precompiled version of the gRPC library and allows you to build only the PHP extension itself, which finishes in a matter of seconds.