Docker 缺少 PHP 扩展的 Composer 安装(自己的容器)

Posted

技术标签:

【中文标题】Docker 缺少 PHP 扩展的 Composer 安装(自己的容器)【英文标题】:Composer Install (own Container) with Docker missing PHP Extensions 【发布时间】:2016-11-04 20:00:39 【问题描述】:

我目前正在学习 Docker,并使用了 2 周。现在我有一个非常简单的任务,通过 Composer 安装 php 库。这通常是在没有 Docker 的情况下工作时:

composer install

现在由于我使用的是 Docker,我发现有一个 Docker 容器,它为我保存作曲家:

docker run --rm -v $(pwd):/app composer/composer install

这工作得很好,但是那里有一些库,需要安装特定的 php 库,比如 bcmath,所以我将它添加到我的 Dockerfile 中

FROM php:7.0-apache
RUN docker-php-ext-install bcmath <-- added this line 
COPY . /var/www/html
WORKDIR /var/www/html
EXPOSE 80

当我重建我的容器时,此代码返回 true

var_dump(extension_loaded('bcmath'))

万岁! BCMath安装正确,但是composer无法识别,因为composer容器中没有安装库!

现在我可以通过使用忽略它

docker run --rm -v $(pwd):/app composer/composer install --ignore-platform-reqs

但在我看来,这是一个肮脏的解决方法,作曲家无法验证我的平台。除了在我的 Dockerfile 中下载 composer 并且不重用现有容器之外,还有什么干净的解决方案吗?

【问题讨论】:

【参考方案1】:

您可以使用platform 设置来模拟您的PHP 容器配置。这将类似于--ignore-platform-reqs 开关(它将使用在composer.json 中配置的PHP 和扩展,而不是来自当前PHP 安装的真实信息),但它为您提供更精细的控制。您可能会说“我确实安装了bcmath,相信我”,而不是“忽略所有平台要求检查”。将检查所有其他要求,因此如果弹出新要求,您仍会收到警告。

"config": 
    "platform": 
        "php": "7.1",
        "ext-bcmath": "*"
    
,

【讨论】:

【参考方案2】:

您需要 PHP + PHP Extensions + Composer 在同一个(!)容器中 = DevContainer。

只需使用here提供的命令安装 Composer。

【讨论】:

请添加一些进一步的解释。这不会破坏拥有一个独立的 Composer 容器的全部目的吗?如果它们没用,它们发布在 Docker hub 上的原因是什么? Composer Docker 镜像不是没用的。人们有不同的用例。它们提供了一种独立运行 Composer 的快速方法。但它们不能用作基本图像。最佳解决方案是使用特定的 PHP 版本和 PHP 扩展来创建您自己的映像,以使您的应用程序启动并运行,这包括 Composer。体积小、效率高、安装快捷。使用不同 PHP 版本作为基础加上 PHP 扩展层和 Composer 层的多阶段将占用更多空间 + 安装速度更慢。这也是 Composer Devs 建议的方式,hub.docker.com/_/composer 请通过编辑将所有解释添加到您的答案中

以上是关于Docker 缺少 PHP 扩展的 Composer 安装(自己的容器)的主要内容,如果未能解决你的问题,请参考以下文章

Docker 缺少 PHP 扩展的 Composer 安装(自己的容器)

Docker php:5.6-apache 403 (因为路径的组件上缺少搜索权限)

在docker python中缺少环境变量:3使用docker-compose

Docker-扩展服务

Docker:如何安装 PHP 7.4 扩展 ext-http?

docker-compose启动php-fpm报错问题