【问题标题】:How to handle missing dependencies with composer & docker?如何使用 composer & docker 处理缺少的依赖项?
【发布时间】:2020-12-20 00:00:58
【问题描述】:

我有一个应用程序,我想通过 Docker 在我的笔记本电脑上安装它以进行本地开发。该应用程序需要来自 composer 的库。

我想避免在我的笔记本电脑上安装 PHP 和所有必要的扩展,只是为了能够运行 composer。

我也不想在我的应用程序容器内部构建期间运行 composer,因为我需要使用挂载绑定在本地计算机上的供应商文件夹。

这对我来说似乎是通过 docker 容器安装 composer 的完美解决方案,如 here 所述:

docker run --rm --interactive --tty \
  --volume $PWD:/app \
  composer install 

但是,这样做时,您如何解决任何 PHP 依赖冲突?

例如

docker run --rm --interactive --tty \
       --volume $PWD:/app \
       composer require phpoffice/phpspreadsheet

会失败

Using version ^1.14 for phpoffice/phpspreadsheet
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpoffice/phpspreadsheet 1.14.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
    - phpoffice/phpspreadsheet 1.14.0 requires ext-gd * -> the requested PHP extension gd is missing from your system.
    - Installation request for phpoffice/phpspreadsheet ^1.14 -> satisfiable by phpoffice/phpspreadsheet[1.14.0, 1.14.1].

我该如何解决这类问题?

【问题讨论】:

标签: php docker composer-php


【解决方案1】:

当您运行installupdaterequire 命令的环境与您将要执行代码的环境不同时,并且如果您绝对确定这些依赖关系将会得到满足代码实际运行时,安装时无需检查。

只需使用--ignore-platform-reqs (docs)。

在为此类项目创建映像时,我通常会在 Dockerfiles 中放入类似这样的内容,最低限度:

composer install --ignore-platform-reqs --prefer-dist

如果人工制品正在为生产做准备,整个事情是这样的:

composer install --ignore-platform-reqs --prefer-dist --no-scripts \
 --no-progress --no-suggest --no-interaction --no-dev --no-autoloader

在这种情况下,将需要执行转储自动加载和执行安装后脚本的几个额外步骤。

您没有详细说明您计划之后如何运行此安装的结果,因此我不确定该部分是否与您相关。

注意:这不是特别依赖于“docker”。每当您在与您计划运行安装不同的机器上创建安装时,此策略都适用。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 2019-06-26
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2020-10-11
    • 2017-12-25
    相关资源
    最近更新 更多