Установка GD в Docker
Я полный новичок Докера, но мне нужно поддерживать существующую систему. Файл Docker, который я использую, выглядит следующим образом:
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
В чем причина этой ошибки?
Ответы
Ответ 1
Вы должны добавить пакет 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)
Затем запустите контейнер:
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
чтобы увидеть вывод в консоли).
Если вы решили запустить контейнер в фоновом режиме, вы можете проверить логи, используя docker logs sitename_test
. Для отслеживания журналов (и просмотра обновлений в журналах) используйте параметр -f
:
docker logs -f sitename_test
Надеюсь, это поможет.
Ответ 2
К сожалению, некоторые расширения php зависят от других программ. Существует проект под названием 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
Внимание: убедитесь, что в этом случае используется правильный контекст сборки.
Ответ 3
Этот 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