有没有将docker composer镜像与自定义php一起使用



我想在Laravel应用程序的多级Dockerfile中使用docker composer映像,以减小其大小。问题是我的依赖项需要PHP 7.4,但composer的PHP是8.1.1。有什么方法可以自定义吗?如果无法降级PHP版本,我该如何缩小docker映像的大小?我应该使用什么来安装我的项目依赖项?

我尝试安装带有--ignore-platform-reqs标志的依赖项,但该应用程序在构建后无法工作。

FROM composer:latest
COPY database/ database/
COPY composer.json composer.json
COPY composer.lock composer.lock
RUN composer install

Composer映像将使用当前最新版本的PHP,因此composer:latest永远不会为您提供7.4。您可以向后扫描旧的Composer docker图像,直到找到基于7.4的最新图像,然后使用该图像的特定版本。

FROM composer:1.10.19

然而,请注意,您永远不会以这种方式获得composer的更新版本。

或者,如果大小是一个问题,那么您可以将图像基于alpine:latest(它很小,目前在其应用程序回购中使用7.4(,然后使用apk add php-cli安装PHP。这将给你一个大约20mb的图像,但Alpine迟早会将他们的基本PHP更新到8.0,你的图像就会崩溃。

最好的选择可能是将您的映像建立在一个显式版本的PHP容器(如php:7.4-cli-alpine(上,然后将最新的Composer安装到该映像中。这将使您能够更好地控制图像中运行的PHP版本,并且以后可以很容易地复制此图像,使其以8.0为基础进行升级测试。

我最近刚刚遇到这个问题,并通过两个步骤解决了它。

  1. 告诉composer使用platform配置使用指定版本的PHP
  2. 告诉composer不要生成自动加载,并在最终图像或运行正确版本PHP的图像中手动执行

这最近成了一个问题,因为在PHP8.1中,post-autoload-dump开始抛出关于Laravel的Collection类的错误。自动加载后的脚本正在运行Laravel代码,这意味着即使我们刚刚安装了v7.X的依赖项,我们仍然在执行8.1版本的脚本。

可能有更好的方法来解决这个问题,如果是这样,请告诉我!,但我就是这么做的。

更新composer.json以指定平台:

"config": {
"platform": {
"php": "7.3.33" // Or your specific version
}
},

告诉编写器跳过自动加载生成:

RUN composer install --no-autoloader

最后,在我的最后一张照片中:

RUN composer dump-autoload

这里的缺点是,您必须在最终映像中安装composer,这在某种程度上违背了在构建过程中拆分作业的目的。

相反,您可以选择遵循Composer docker图像自述中的建议,并以这种方式将其包括在内,然后完全放弃多阶段构建。:

COPY --from=composer /usr/bin/composer /usr/bin/composer

虽然我不能自信地说没有更好的选择来解决这个问题,但我希望这个答案能解释为什么这个问题存在,并为你解决它指明正确的方向。

最新更新