wp-env Не удалось открыть входной файл: /tmp/composer-setup.php

Вопрос или проблема

При запуске wp-env start я получаю следующую ошибку, и wp-env падает:

 > [cli 12/14] RUN php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer:
#43 0.447 Could not open input file: /tmp/composer-setup.php

Кажется, файл /tmp/composer-setup.php отсутствует в wp-env-docker-environment, а не на моей машине Ubuntu. Этот файл был загружен через curl на этапе 38:


#38 [cli 10/14] RUN curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
#38 CACHED

Я использую:

  • Ubuntu 22.04
  • Docker version 27.5.1
  • Node.js v22.5.1.

Ответ или решение

Вопрос о возникшей ошибке при попытке запустить команду wp-env start является довольно распространенной проблемой при работе с инструментами разработки, использующими PHP и Composer в окружении Docker. Разберем эту проблему в деталях и предложим возможные решения.

Теория

Ошибка возникает на этапе, когда система пытается выполнить скрипт /tmp/composer-setup.php с помощью команды PHP. Сообщение об ошибке "Could not open input file: /tmp/composer-setup.php" указывает на то, что необходимый файл не найден в указанной директории контейнера. Проблема может происходить из-за ряда причин; в вашем случае, на этапе 38, где используется команда curl для загрузки скрипта установки Composer, указывается, что этот шаг был кэширован. Это может указывать на потенциальную проблему с кэшированием Docker-слоев.

Когда Docker-контейнеры создаются из Dockerfile, слои образов могут быть кэшированы для ускорения последующих сборок. Если во время предыдущей сборки, по каким-то причинам, файл не был успешно загружен, а команда была кэширована как успешная, это может привести к текущей проблеме. Таким образом, несмотря на успешное выполнение команды Curl в кэше, фактически файл может отсутствовать.

Особенность и непредсказуемость ошибок в Docker связаны также с особенностями монтирования файлов и сетей; таким образом, ошибка может лежать и в плане недостаточной конфигурации Docker-сети или прав доступа в контейнерах.

Пример

Представьте себе, что вы пишете Dockerfile для установки и настройки PHP-среды, которая соответственно включает установку Composer. На одном из этапов вы используете команду:

RUN curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php

Следующей командой идет:

RUN php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

Весь процесс кажется достаточно простым: загрузите инсталлер и запустите его с помощью PHP. Но если загрузка скрипта будет неудачной, например, из-за временного отсутствия доступа к Интернету или проблем с DNS, файл просто окажется отсутствующим. Однако Docker может кэшировать "успешную" команду загрузки, что приведет к незаметному для вас исчезновению скрипта в последующих сборках.

Применение

Чтобы решить эту проблему, вам необходимо предпринять следующие шаги:

  1. Очистка Docker-кэша: Попробуйте очистить кэш Docker-сборок, чтобы убедиться, что все команды выполняются заново. Это можно сделать с помощью:

    docker builder prune

    или если требуется более глубокая очистка:

    docker system prune --all
  2. Проверка команд: Убедитесь, что команды в вашем Dockerfile верны. Вы можете временно добавить флаг -v (verbose) к команде curl для детальной информации:

    RUN curl -v -sS https://getcomposer.org/installer -o /tmp/composer-setup.php
  3. Проверка доступа к сети: Убедитесь, что окружение Docker имеет доступ к сети, и DNS правильно сконфигурирован. Это можно проверить, попытавшись вручную выполнить curl в оболочке уже работающего контейнера:

    docker exec -it <your_container_name> /bin/bash
    curl -v -sS https://getcomposer.org/installer
  4. Логи и отладка: Проверьте логи Docker для получения дополнительной информации об ошибках сетевого доступа или проблемах выполнения:

    docker logs <your_container_name>
  5. Альтернативные решения: Если проблема продолжается, рассмотрите возможность загрузки скрипта установки Composer вне Docker, а затем скопируйте файл в контейнер через Dockerfile:

    COPY ./composer-setup.php /tmp/composer-setup.php

Эти действия помогут вам устранить проблему, связанную с отсутствием скрипта /tmp/composer-setup.php, и обеспечат стабильное выполнение команды wp-env start.

Оцените материал
Добавить комментарий

Капча загружается...