使用Docker + PHP7 + GD导致"调用未定义的函数imagecreatefromjpeg()"

Joh*_*cki 24 php gd php-gd docker

尝试imagecreatefromjpeg使用此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-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/
Run Code Online (Sandbox Code Playgroud)

GD已正确安装(libjpeg也 - 出现在php -i和中phpinfo())但imagecreatefromjpeg不起作用,我不知道为什么.


我也apt install libjpeg-dev libpng-dev libfreetype6-dev尝试〜强制〜重新安装(或重新配置)但似乎没有成功(是的,我也重启容器).

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# 
Run Code Online (Sandbox Code Playgroud)
root@e8db647c96c4:/var/www/html# docker-php-ext-enable gd

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

root@e8db647c96c4:/var/www/html# 
Run Code Online (Sandbox Code Playgroud)

我试过apt install libgd2-xpm-dev*,显然它没有解决问题.


解决了

我很想丢掉

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

进入我的Dockerfile.


完整修订的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/
Run Code Online (Sandbox Code Playgroud)

Tom*_*asz 20

PHP 7.4(高山)

如果有人正在努力使用PHP 7.4在 GD 中启用 JPEG 支持,这就是我必须做的才能使用imagecreatefromjpeg()函数。我的示例基于 Alpine 3.10,如果您使用其他发行版,请根据您的需要进行调整。

首先安装依赖项,就我而言,除了 JPEG 之外,我还需要支持 PNG 文件。

apk add jpeg-dev libpng-dev
Run Code Online (Sandbox Code Playgroud)

之后,我们可以运行docker-php-ext-configure命令来配置我们的 gd 支持 JPEG。请注意,标志--with-jpeg-dir已更改为--with-jpeg,我们不需要提供标志来启用 PNG。您可以在 GD 部分的PHP 7.4 Changelog中阅读更多内容。

docker-php-ext-configure gd --with-jpeg
Run Code Online (Sandbox Code Playgroud)

在那之后,让我们运行docker-php-ext-install以安装 GD 本身。

docker-php-ext-install -j$(nproc) gd
Run Code Online (Sandbox Code Playgroud)

完整示例

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
Run Code Online (Sandbox Code Playgroud)


Jin*_*Jin 5

对于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
Run Code Online (Sandbox Code Playgroud)

如果仍然无法正常工作,可以重新安装容器。

docker rm <container id> 
docker-compose build --pull
docker-compose up
Run Code Online (Sandbox Code Playgroud)

  • 如果收到错误“ Package'libpng12-dev'没有安装候选程序”(前一段时间删除),则可以将“ libpng12-dev”更改为“ libpng-dev”以使其正常运行 (2认同)