Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Troubles with Docker + PHP7 + GD resulting in "Call to undefined function imagecreatefromjpeg()"

I'm having troubles when trying to create an image using imagecreatefromjpeg using this Dockerfile to generate the container:

FROM  php:7.1-apache

RUN apt-get update && \
    apt-get install -y -qq git \
        libjpeg62-turbo-dev \
        apt-transport-https \
        libfreetype6-dev \
        libmcrypt-dev \
        libpng12-dev \
        libssl-dev \
        zip unzip \
        nodejs \
        npm \
        wget \
        vim

RUN pecl install redis && docker-php-ext-enable redis
RUN docker-php-ext-install -j$(nproc) iconv mcrypt zip pdo pdo_mysql gd bcmath

COPY ./containers/yii.conf /etc/apache2/sites-available/000-default.conf

RUN for mod in rewrite headers; do a2enmod $mod; done && service apache2 restart

WORKDIR /var/www/html/

GD was correctly installed (libjpeg too - both appearing in php -i and phpinfo()) but imagecreatefromjpeg does not works and I don't know why.


I also ran apt install libjpeg-dev libpng-dev libfreetype6-dev trying to ~force~ reinstallation (or reconfiguration) but seems doesn't succeded (yes, I also restart the container).

root@e8db647c96c4:/var/www/html# php -i | grep -i GD
/usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
gd
GD Support => enabled
GD Version => bundled (2.1.0 compatible)
gd.jpeg_ignore_warning => 1 => 1
root@e8db647c96c4:/var/www/html# 

root@e8db647c96c4:/var/www/html# docker-php-ext-enable gd

warning: gd (gd.so) is already loaded!

root@e8db647c96c4:/var/www/html# 

I've tried apt install libgd2-xpm-dev* and apparently it doesn't solves the problem.


Solved

I was missing to put

RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) gd

into my Dockerfile.


Full revised Dockerfile:

FROM  php:7.1-apache

RUN apt-get update && \
    apt-get install -y -qq git \
        libjpeg62-turbo-dev \
        apt-transport-https \
        libfreetype6-dev \
        libmcrypt-dev \
        libpng12-dev \
        libssl-dev \
        zip unzip \
        nodejs \
        npm \
        wget \
        vim

RUN pecl install redis && docker-php-ext-enable redis
RUN docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
RUN docker-php-ext-install -j$(nproc) iconv mcrypt zip pdo pdo_mysql gd bcmath

COPY ./containers/yii.conf /etc/apache2/sites-available/000-default.conf

RUN for mod in rewrite headers; do a2enmod $mod; done && service apache2 restart

WORKDIR /var/www/html/
like image 711
John Murowaniecki Avatar asked Nov 14 '17 17:11

John Murowaniecki


People also ask

Why is imagecreatefromjpeg not working in PHP?

The fatal error above means that PHP’s GD library has not been installed or enabled. As a result, PHP is unable to find the function imagecreatefromjpeg. Unfortunately, the GD library is not enabled by default. As a result, you might run into fatal errors when you attempt to deploy image manipulation functions to a fresh PHP install.

What happened to PHP_GD DLL in PHP 8?

PHP 8 & GD on Windows. If you are using GD with PHP 8 on Windows, then you should be aware that the extension is now called php_gd.dll. In other words, they have taken the “2” out of it. This article was posted in Code, PHP Tutorials.

How to fix fatal error – call to undefined function imagecreatefromjpeg?

Fix – Fatal error: Call to undefined function imagecreatefromjpeg. This is a short guide on how to fix the following PHP error: The fatal error above means that PHP’s GD library has not been installed or enabled. As a result, PHP is unable to find the function imagecreatefromjpeg. Unfortunately, the GD library is not enabled by default.

What happened to the GD extension in PHP 8?

If you are using GD with PHP 8 on Windows, then you should be aware that the extension is now called php_gd.dll. In other words, they have taken the “2” out of it. This article was posted in Code, PHP Tutorials.


3 Answers

PHP 7.4 (Alpine)

If anybody is struggling to enable JPEG support in GD with PHP 7.4, here's what I had to do in order to be able to use imagecreatefromjpeg() function. My example is based on Alpine 3.10, if you're using other distribution adjust it to your needs.

First install dependencies, in my case beside JPEG I need support for PNG files.

apk add jpeg-dev libpng-dev

After that we can run docker-php-ext-configure command to configure our gd with JPEG support. Notice that flag --with-jpeg-dir was changed to --with-jpeg and we don't need to provide flag to enable PNG. More you can read in PHP 7.4 Changelog in GD section.

docker-php-ext-configure gd --with-jpeg

Directly after that let's run docker-php-ext-install to install GD itself.

docker-php-ext-install -j$(nproc) gd

FULL EXAMPLE

FROM php:7.4-fpm-alpine3.10

RUN apk add jpeg-dev libpng-dev \
    && docker-php-ext-configure gd --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd
like image 145
Tomasz Avatar answered Oct 07 '22 17:10

Tomasz


For PHP 5.6

FROM php:5.6-apache

RUN apt-get update && apt-get install -y \ 
libfreetype6-dev libjpeg62-turbo-dev \ 
libgd-dev libpng12-dev
RUN docker-php-ext-configure gd \ 
--with-freetype-dir=/usr/include/ \ 
--with-jpeg-dir=/usr/include/
RUN docker-php-ext-install gd

If still not working, can re-install the container.

docker rm <container id> 
docker-compose build --pull
docker-compose up
like image 21
Jin Avatar answered Oct 07 '22 19:10

Jin


Updated Version PHP 7.4 + Apache:

Dockerfile

FROM php:7.4-apache

RUN apt-get update -y && apt-get install -y sendmail libpng-dev libfreetype6-dev libjpeg62-turbo-dev libgd-dev libpng-dev

RUN docker-php-ext-install pdo pdo_mysql 

RUN docker-php-ext-configure gd \ 
--with-freetype=/usr/include/ \ 
--with-jpeg=/usr/include/

RUN docker-php-ext-install gd

...
like image 3
mleister Avatar answered Oct 07 '22 17:10

mleister