корневой файл composer.json «phpspreadsheet» требует расширения PHP ext-gd*, но оно отсутствует

#dockerfile #laravel-8 #phpspreadsheet #laravel-excel #phpoffice-phpspreadsheet

Вопрос:

Я запускаю приложение Laravel и добавил Laravel Excel, для чего требуется phpoffice/phpspreadsheet . Так как обе зависимости добавлены в мой файл composer.json…,

 "maatwebsite/excel": "^3.1",
"phpoffice/phpspreadsheet": "^1.18",
 

Я столкнулся со следующей проблемой при сборке:

  > [vendor 3/4] RUN composer install     --no-scripts:
#14 0.883 Installing dependencies from lock file (including require-dev)
#14 0.902 Verifying lock file contents can be installed on current platform.
#14 0.934 Your lock file does not contain a compatible set of packages. Please run composer update.
#14 0.934
#14 0.934   Problem 1
#14 0.934     - Root composer.json requires PHP extension ext-gd * but it is missing from your system. Install or enable PHP's gd extension.
#14 0.934   Problem 2
#14 0.934     - phpoffice/phpspreadsheet is locked to version 1.18.0 and an update of this package was not requested.
#14 0.934     - phpoffice/phpspreadsheet 1.18.0 requires ext-gd * -> it is missing from your system. Install or enable PHP's gd extension.
#14 0.934   Problem 3
#14 0.934     - phpoffice/phpspreadsheet 1.18.0 requires ext-gd * -> it is missing from your system. Install or enable PHP's gd extension.
#14 0.934     - maatwebsite/excel 3.1.33 requires phpoffice/phpspreadsheet ^1.18 -> satisfiable by phpoffice/phpspreadsheet[1.18.0].
#14 0.934     - maatwebsite/excel is locked to version 3.1.33 and an update of this package was not requested.
#14 0.934
#14 0.934 To enable extensions, verify that they are enabled in your .ini files:
#14 0.934     - /usr/local/etc/php/php-cli.ini
#14 0.934     - /usr/local/etc/php/conf.d/docker-php-ext-bz2.ini
#14 0.934     - /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
#14 0.934     - /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
#14 0.934 You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
------
executor failed running [/bin/sh -c composer install     --no-scripts]: exit code: 2
 

Мой Док-файл:

 # PHP Dependencies
FROM composer:2.1.6 as vendor
COPY . /app
RUN composer install 
    --no-scripts
RUN composer dump-autoload

# Frontend
FROM node:16.7 as frontend
COPY . /app
WORKDIR /app
RUN npm install amp;amp; npm run dev amp;amp; rm -rf node_modules
RUN ls -R -lsah /app

# Application
FROM php:7.4.21-apache
# Install system dependencies
RUN apt-get update amp;amp; apt-get install  
    git 
    curl 
    libpng-dev 
    libxml2-dev 
    zip 
    unzip -y
RUN docker-php-ext-install pdo_mysql gd
RUN a2enmod rewrite
COPY --chown=www-data:www-data . /var/www/html
COPY --chown=www-data:www-data --from=vendor /app/vendor/ /var/www/html/vendor/
COPY --chown=www-data:www-data --from=frontend /app/public/js/ /var/www/html/public/js/
COPY --chown=www-data:www-data --from=frontend /app/public/css/ /var/www/html/public/css/
COPY --chown=www-data:www-data --from=frontend /app/public/mix-manifest.json /var/www/html/public/mix-manifest.json
RUN php artisan optimize:clear
 

Я не уверен, где я буду продолжать. Когда я создаю контейнер без COPY --chown=www-data:www-data --from=vendor , я могу получить некоторую информацию о php:

ext-gd установлен:

 root@303d9b2b0694:/var/www/html# php -ini | grep gd
Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
gd
 

This also looks fine, doesn’t it?

 root@303d9b2b0694:/var/www/html# php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File:         (none)
Scan for additional .ini files in: /usr/local/etc/php/conf.d
Additional .ini files parsed:      /usr/local/etc/php/conf.d/docker-php-ext-gd.ini,
/usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini,
/usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
 

my require composer:

     "require": {
        "php": "^7.4|^8.0",
        "ext-gd": "*",
        "ext-json": "*",
        "doctrine/dbal": "^3.1.1",
        "fideloper/proxy": "^4.4",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.3.0",
        "jenssegers/agent": "^2.6",
        "laravel/framework": "^8.12",
        "laravel/jetstream": "^2.3.11",
        "laravel/sanctum": "^v2.11.2",
        "laravel/tinker": "^v2.6.1",
        "league/oauth2-client": "^2.6",
        "livewire/livewire": "^v2.5.1",
        "maatwebsite/excel": "^3.1",
        "microsoft/microsoft-graph": "^1.34.0",
        "motze92/office365-mail": "^2.0.7",
        "phpoffice/phpspreadsheet": "^1.18",
        "predis/predis": "^1.1"
    },
 

last but not least, the modules:

 root@303d9b2b0694:/var/www/html# php -m
[PHP Modules]
Core
ctype
curl
date
dom
fileinfo
filter
ftp
gd
hash
iconv
json
libxml
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
SimpleXML
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
zlib

[Zend Modules]
 

Отредактированный

Мой php.info короткий путь в отношении PHP extension ext-gd :

 gd

GD Support => enabled
GD Version => bundled (2.1.0 compatible)
GIF Read Support => enabled
GIF Create Support => enabled
PNG Support => enabled
libPNG Version => 1.6.36
WBMP Support => enabled
XBM Support => enabled
BMP Support => enabled
TGA Read Support => enabled
 

Отредактировано 2

Причина этого, по-видимому, кроется в FROM composer:2.1.6 as vendor сцене. Я думал, что ошибка произошла со FROM php:7.4.21-apache сцены, которая отняла у меня много времени, играя с модулями и библиотеками.

Теперь я установлю GD на composer сцену и посмотрю, решит ли это проблему

Я очень ценю любой намек или совет! Большое Спасибо!

Комментарии:

1. О, я забыл упомянуть, что файл compose.json/.lock отлично работает на моем компьютере разработчика. Это поведение относится только к сборке docker.

Ответ №1:

Я, наконец, решил эту проблему. Причина очень проста. На первом этапе композитор устанавливает зависимости из файла блокировки, где они не PHP extension ext-gd установлены.

Поэтому я добавил расширение к FROM composer:2.1.6 as vendor сцене:

 # PHP Dependencies
FROM composer:2.1.6 as vendor
RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev amp;amp; 
  docker-php-ext-configure gd 
    --with-freetype 
    --with-jpeg 
  NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) amp;amp; 
  docker-php-ext-install -j$(nproc) gd amp;amp; 
  apk del --no-cache freetype-dev libpng-dev libjpeg-turbo-dev

COPY . /app
RUN composer install 
    --no-scripts
RUN composer dump-autoload

 

Надеюсь, это может помочь и другим членам сообщества.