Установка GD в Docker

Я новичок в Docker, но мне нужно поддерживать существующую систему. Dockerfile, который я использую, как показано ниже:

FROM php:5.6-apache

RUN docker-php-ext-install mysql mysqli

RUN apt-get update -y && apt-get install -y sendmail

RUN apt-get update && \
    apt-get install -y \
        zlib1g-dev 

RUN docker-php-ext-install mbstring

RUN docker-php-ext-install zip

RUN docker-php-ext-install gd

Когда я запускаю 'docker build [sitename]', все выглядит нормально, пока я не получу ошибку:

configure: error: png.h not found.
The command '/bin/sh -c docker-php-ext-install gd' returned a non-zero code: 1

В чем причина этой ошибки?

7 ответов

Решение

Вы должны добавить libpng-dev пакет к вашему Dockerfile:

FROM php:5.6-apache

RUN docker-php-ext-install mysql mysqli

RUN apt-get update -y && apt-get install -y sendmail libpng-dev

RUN apt-get update && \
    apt-get install -y \
        zlib1g-dev 

RUN docker-php-ext-install mbstring

RUN docker-php-ext-install zip

RUN docker-php-ext-install gd

Затем перейдите в каталог с Dockerfile и запустить:

docker build -t sitename .

Это сработало в моем случае:

Removing intermediate container f03522715567
Successfully built 9d69212196a2

Дайте мне знать, если вы получите какие-либо ошибки.

РЕДАКТИРОВАТЬ:

Вы должны увидеть что-то вроде этого:

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sitename            latest              9d69212196a2        19 minutes ago      414 MB
<none>              <none>              b6c69576a359        25 minutes ago      412.3 MB

EDIT2:

Просто перепроверить все:

Пожалуйста, запустите docker build команда таким образом:

docker build -t sitename:1.0 .

(добавление :1.0 не должно ничего менять, я добавил это просто для того, чтобы иметь дополнительную строку в docker images выход)

Затем запустите контейнер:

docker run --name sitename_test -p 80:80 sitename:1.0

Это должно работать просто отлично.

Я предположил, что Apache использует стандартный порт (80) - возможно, вам нужно настроить это. Если у вас есть другие службы / контейнеры, прослушивающие порт 80, вы можете сделать так, чтобы ваш контейнер прослушивал другой порт:

docker run --name sitename_test -p 8080:80 sitename:1.0

Это перенаправит трафик с порта 8080 на порт 80 "внутри" контейнера.

Обычно вы запускаете контейнер в фоновом режиме. Для этого добавьте -d вариант к docker run команда (но для целей тестирования вы можете опустить -d чтобы увидеть вывод в консоли).

Надеюсь, это поможет.

Это не относится к OP, но я обнаружил, что для тех, кто использует php:7.4-fpm-alpine синтаксис немного другой

FROM php:7.4-fpm-alpine

# ... Other instructions ...

# Setup GD extension
RUN apk add --no-cache \
      freetype \
      libjpeg-turbo \
      libpng \
      freetype-dev \
      libjpeg-turbo-dev \
      libpng-dev \
    && docker-php-ext-configure gd \
      --with-freetype=/usr/include/ \
      # --with-png=/usr/include/ \ # No longer necessary as of 7.4; https://github.com/docker-library/php/pull/910#issuecomment-559383597
      --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-enable gd \
    && apk del --no-cache \
      freetype-dev \
      libjpeg-turbo-dev \
      libpng-dev \
    && rm -rf /tmp/*

# ... Other instructions ...

Этот ответ слишком запоздал, но он поможет.

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

Это Dockerfile работал с Php7 https://hub.docker.com/r/giapnh/php7-gd

FROM php:7-fpm

RUN docker-php-ext-install mysqli pdo pdo_mysql
RUN apt-get update -y && apt-get install -y libwebp-dev libjpeg62-turbo-dev libpng-dev libxpm-dev \
    libfreetype6-dev
RUN apt-get update && \
    apt-get install -y \
        zlib1g-dev 

RUN docker-php-ext-install mbstring

RUN apt-get install -y libzip-dev
RUN docker-php-ext-install zip

RUN docker-php-ext-configure gd --with-gd --with-webp-dir --with-jpeg-dir \
    --with-png-dir --with-zlib-dir --with-xpm-dir --with-freetype-dir \
    --enable-gd-native-ttf

RUN docker-php-ext-install gd

CMD ["php-fpm"]

EXPOSE 9000

К сожалению, некоторые расширения php зависят от других программ. Существует проект под названием https://github.com/mlocati/docker-php-extension-installer, который вы можете использовать для установки расширений PHP. Это обеспечит наличие необходимых зависимостей.

Поскольку мне нужен этот внешний скрипт в нескольких контейнерах, я поместил его в общий скрипт, который затем включил в требуемый Dockerfile.

Скрипт (в.shared / scripts / install_php_extensions.sh)

#!/bin/sh

# add wget
apt-get update -yqq && apt-get -f install -yyq wget

# download helper script
wget -q -O /usr/local/bin/install-php-extensions https://raw.githubusercontent.com/mlocati/docker-php-extension-installer/master/install-php-extensions \
    || (echo "Failed while downloading php extension installer!"; exit 1)

# install all required extensions
chmod uga+x /usr/local/bin/install-php-extensions && sync && install-php-extensions \
    gd \
;

Dockerfile

# get the scripts from the build context and make sure they are executable
COPY .shared/scripts/ /tmp/scripts/
RUN chmod +x -R /tmp/scripts/

# install extensions
RUN /tmp/scripts/install_php_extensions.sh

Внимание: убедитесь, что в этом случае используется правильный контекст сборки.

PHP 7.4 и выше

      FROM wordpress:php7.4
RUN apt-get update && apt-get install -y \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libpng-dev \
    libwebp-dev \
    libxpm-dev \
    zlib1g-dev && \
    docker-php-ext-configure gd --enable-gd --with-webp --with-jpeg \
    --with-xpm --with-freetype && \
    docker-php-ext-install -j$(nproc) gd && \
    rm -rf /var/lib/apt/lists/*

Это проблема с образом Docker для Composer. Поэтому лучше всего следовать предложению из проблемы выше и заменить строку command: install следующим образом:

composer:    
       ...
       command: install --ignore-platform-reqs

Для получения дополнительной информации перейдите по этой ссылке: https://github.com/nanoninja/docker-nginx-php-mysql/issues/28

Другие вопросы по тегам