[英]Is there anyway to use docker composer image with custom php?
我想为我的 laravel 应用程序在多级 dockerfile 中使用 docker 作曲家图像以减小其大小。 我的依赖项需要 PHP 7.4 的问题,但作曲家的 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
但是请注意,您永远不会以这种方式获得作曲家的更新版本。
或者,如果大小是一个问题,那么您可以将您的图像基于alpine:latest
(它很小,目前在其应用程序仓库中使用 7.4),然后使用apk add php-cli
安装 PHP。 这将为您提供大约 20mb 的图像,但 Alpine 迟早会将其基础 PHP 更新为 8.0,您的图像会损坏。
可能您最好的选择是将您的映像基于显式版本化的 PHP 容器之一,例如php:7.4-cli-alpine
,然后将最新的 Composer 安装到该映像中。 这将使您更好地控制在您的映像中运行的 PHP 版本,并且稍后复制此映像以使其基于 8.0 进行升级测试将非常容易。
我最近遇到了这个问题,并通过两个步骤解决了它。
platform
配置告诉作曲家使用 PHP 的指定版本。 这最近成为一个问题,因为在 PHP 8.1 中, post-autoload-dump
开始抛出有关 Laravel 的Collection
class 的错误。 后自动加载脚本正在运行 Laravel 代码,这意味着即使我们刚刚安装了 v 7.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
虽然我不能自信地说没有更好的选择来解决这个问题,但我希望这个答案能够解释问题存在的原因,并为您指明解决问题的正确方向。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.