【问题标题】:Troubles with Docker + PHP7 + GD resulting in "Call to undefined function imagecreatefromjpeg()"Docker + PHP7 + GD 的问题导致“调用未定义的函数 imagecreatefromjpeg()”
【发布时间】:2018-04-27 18:45:35
【问题描述】:

我在尝试使用 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/

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


我还运行 apt install libjpeg-dev libpng-dev libfreetype6-dev 尝试 ~force~ 重新安装(或重新配置),但似乎没有成功(是的,我也重新启动了容器)。

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# 

我试过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

进入我的 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/

【问题讨论】:

  • docker-php-ext-configure gd 命令是我出售类似错误所需要的。谢谢!
  • 请将您的解决方案移至自己的答案,谢谢。
  • PHP 7.4 的新版本不再有--with-freetype-dir--with-jpeg-dir 选项。相反,我使用了--with-freetype--with-jpeg 选项,我的测试套件又变成了绿色。

标签: php docker gd php-gd


【解决方案1】:

更新版本 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

...

【讨论】:

    【解决方案2】:

    PHP 7.4(高山)

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

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

    apk add jpeg-dev libpng-dev
    

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

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

    紧接着,让我们运行 docker-php-ext-install 来安装 GD 本身。

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

    完整示例

    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
    

    【讨论】:

    • 你拯救了我的一天。谢谢!
    • 我的包是libjpeg-dev而不是jpeg-dev
    【解决方案3】:

    对于 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
    

    如果还是不行,可以重新安装容器。

    docker rm <container id> 
    docker-compose build --pull
    docker-compose up
    

    【讨论】:

    • 在您上面的 Dockerfile 内容示例中,路径 /usr/include/ 是在容器内还是在主机上?我相信 Dockerfile 只能引用其中的路径? stackoverflow.com/questions/31448821/…(谢谢)
    • 正确,路径在容器内。
    • 如果您收到错误 Package 'libpng12-dev' has no installation candidate(前段时间已删除),您可以将 libpng12-dev 更改为 libpng-dev 以使其正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    相关资源
    最近更新 更多