Как можно решить проблему с ошибкой «requires ext-zip * -> он отсутствует в вашей системе. Установите или активируйте zip-расширение PHP»?

Я использую Docker и у меня есть следующий Dockerfile:

```dockerfile
FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    git \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    libzip-dev \
    zip \
    unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
RUN docker-php-ext-enable zip

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www

USER $user
```

При выполнении команды `docker-compose exec app composer install` возникает следующая ошибка:

```
- server is locked to version dev-master and an update of this package was not requested.
  - server dev-master requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
Problem 2
  - phpof is locked to version 1.25.2 and an update of this package was not requested.
  - phpof 1.25.2 requires ext-zip * -> it is missing from your system. Install or enable PHP's zip extension.
```

Я уже пробовал использовать команду `RUN apt-get install php-zip` и `RUN apt-get install php7.4-zip`, но они не сработали. Вместо этого я использовал следующий код:

```
RUN apt-get update && apt-get install -y \
    libzip-dev \
    zip 

RUN docker-php-ext-install zip
RUN docker-php-ext-enable zip
```

Как мне решить возникшую ошибку, связанную с отсутствием расширения zip в PHP?
  • 14 декабря 2024 г. 18:03
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с тем, что вам необходимо установить и активировать расширение `zip` в вашем Docker-окружении PHP. Согласно вашему Dockerfile, вы уже делаете правильные шаги для установки расширения `zip`, но проблема может быть вызвана тем, что вы не перезапускаете контейнер после изменения `Dockerfile`, или не устанавливаете все зависимости правильно.

Вот несколько шагов, которые вы можете попробовать для решения вашей проблемы:

1. **Проверьте наличие расширения zip в контейнере:** 
   После того как вы установили и включили расширение `zip`, можно выполнить команду внутри контейнера, чтобы убедиться, что расширение действительно активно. Для этого выполните:
   ```bash
   docker-compose exec app php -m | grep zip
   ```
   Если пакет не отображается, значит, расширение не было установлено или активировано.

2. **Обновите кеш Composer:** Если вы изменяли ваш `Dockerfile`, убедитесь, что кеш для Composer обновлён. Вы можете запустить:
   ```bash
   docker-compose exec app composer clear-cache
   ```

3. **Обновите и перестройте контейнер:** После изменения Dockerfile вам нужно перестроить контейнер. Используйте следующую команду:
   ```bash
   docker-compose build --no-cache
   ```
   Это гарантирует, что все шаги выполнены заново без использования кеша.

4. **Убедитесь, что порядок команд верный:** В вашем Dockerfile команды для установки зависимостей и активации расширений должны идти в логическом порядке. Убедитесь, что все установленные пакеты перед вызовом `docker-php-ext-install`.

5. **Проверка Dockerfile:** Убедитесь, что ваш Dockerfile выглядит следующим образом:
   ```dockerfile
   FROM php:7.4-fpm

   ARG user
   ARG uid

   RUN apt-get update && apt-get install -y \
       git \
       curl \
       libpng-dev \
       libonig-dev \
       libxml2-dev \
       libzip-dev \
       zip \
       unzip && \
       apt-get clean && rm -rf /var/lib/apt/lists/*

   RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip && \
       docker-php-ext-enable zip

   # Get latest Composer
   COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

   RUN useradd -G www-data,root -u $uid -d /home/$user $user
   RUN mkdir -p /home/$user/.composer && \
       chown -R $user:$user /home/$user

   WORKDIR /var/www

   USER $user
   ```

6. **Запустить composer install:** После всех изменений и перезапусков, попробуйте снова выполнить команду `composer install`:
   ```bash
   docker-compose exec app composer install
   ```

Если после выполнения всех вышеперечисленных шагов проблема не решена, проверьте, не используется ли какой-то другой контейнерный образ, который может перекрывать настройки вашего PHP окружения.
Попробовал собрать образ из представленного Dockerfile и проверить подключилось ли расши рение: 
docker build --build-arg user=user --build-arg uid=1000 --tag test .

... пропущено много буков ...

docker run --rm -it test:latest php -m | grep zip
zip


Да всё в порядке - расши рение установилось.

PS
Образ крайне не оптимальный - весь мусор который генерируется во время установки из исходников не стёрт, кеши APT не стёрты, такой образ должен быть размером можт чуть больше 100 мегабайт. Я бы взял в качестве базового образа свежий Debian, подключил бы репозиторий с PHP и установил бы всё из готовых пакетов - это сильно ускорит сборку и позволит сделать образ меньше как минимум из-за того, что сборочному мусору неоткуда будет взяться.
Похожие вопросы