无论如何,是否可以将 docker 作曲家图像与自定义 php 一起使用?
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
我最近才 运行 解决这个问题,用两步就解决了。
- 通过
platform
配置告诉作曲家使用指定版本的 PHP。
- 告诉 composer 不要 生成自动加载,并在您的最终图像或图像 运行 PHP 的正确版本中手动执行。
这最近成为一个问题,因为在 PHP 8.1 中,post-autoload-dump
开始抛出有关 Laravel 的 Collection
class 的错误。 post 自动加载脚本是 运行 Laravel 代码,这意味着即使我们刚刚安装了 v 7.X 的依赖项,我们仍在使用 8.1 执行脚本。
可能有更好的方法来解决这个问题,如果是的话请告诉我!但我就是这样做的。
已更新 composer.json
以指定平台:
"config": {
"platform": {
"php": "7.3.33" // Or your specific version
}
},
告诉作曲家 skip autoload generation:
RUN composer install --no-autoloader
最后,在我的最终图像中:
RUN composer dump-autoload
这里的缺点是您必须在最终映像中安装 composer,这在某种程度上违背了在构建期间拆分作业的目的。
您可以选择遵循 Composer docker image readme 的建议并以这种方式包含它,并完全放弃多阶段构建。:
COPY --from=composer /usr/bin/composer /usr/bin/composer
虽然我不能自信地说没有更好的选择来解决这个问题,但我希望这个答案能解释为什么问题存在,并指出你正确的解决方向。
Composer 映像将使用当前最新版本的 PHP,因此 composer:latest
永远不会让您获得 7.4。您可以向后浏览旧的 Composer docker 图像,直到找到基于 7.4 的最新图像,然后使用该图像的特定版本。
FROM composer:1.10.19
但是请注意,您永远不会通过这种方式获得更新版本的作曲家。
或者,如果大小是一个问题,那么您可以将图像基于 alpine:latest
(它很小,目前在其应用程序存储库中使用 7.4),然后安装 PHP 和 apk add php-cli
.这将为您提供大约 20mb 的图像,但 Alpine 迟早会将其基础 PHP 更新为 8.0,您的图像将损坏。
可能您最好的选择是将您的映像基于明确版本控制的 PHP 容器之一,例如 php:7.4-cli-alpine
,然后将最新的 Composer 安装到该映像中。这将使您更好地控制图像中运行的 PHP 版本,并且稍后复制此图像以基于 8.0 进行升级测试将非常容易。
我想在我的 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
我最近才 运行 解决这个问题,用两步就解决了。
- 通过
platform
配置告诉作曲家使用指定版本的 PHP。 - 告诉 composer 不要 生成自动加载,并在您的最终图像或图像 运行 PHP 的正确版本中手动执行。
这最近成为一个问题,因为在 PHP 8.1 中,post-autoload-dump
开始抛出有关 Laravel 的 Collection
class 的错误。 post 自动加载脚本是 运行 Laravel 代码,这意味着即使我们刚刚安装了 v 7.X 的依赖项,我们仍在使用 8.1 执行脚本。
可能有更好的方法来解决这个问题,如果是的话请告诉我!但我就是这样做的。
已更新 composer.json
以指定平台:
"config": {
"platform": {
"php": "7.3.33" // Or your specific version
}
},
告诉作曲家 skip autoload generation:
RUN composer install --no-autoloader
最后,在我的最终图像中:
RUN composer dump-autoload
这里的缺点是您必须在最终映像中安装 composer,这在某种程度上违背了在构建期间拆分作业的目的。
您可以选择遵循 Composer docker image readme 的建议并以这种方式包含它,并完全放弃多阶段构建。:
COPY --from=composer /usr/bin/composer /usr/bin/composer
虽然我不能自信地说没有更好的选择来解决这个问题,但我希望这个答案能解释为什么问题存在,并指出你正确的解决方向。
Composer 映像将使用当前最新版本的 PHP,因此 composer:latest
永远不会让您获得 7.4。您可以向后浏览旧的 Composer docker 图像,直到找到基于 7.4 的最新图像,然后使用该图像的特定版本。
FROM composer:1.10.19
但是请注意,您永远不会通过这种方式获得更新版本的作曲家。
或者,如果大小是一个问题,那么您可以将图像基于 alpine:latest
(它很小,目前在其应用程序存储库中使用 7.4),然后安装 PHP 和 apk add php-cli
.这将为您提供大约 20mb 的图像,但 Alpine 迟早会将其基础 PHP 更新为 8.0,您的图像将损坏。
可能您最好的选择是将您的映像基于明确版本控制的 PHP 容器之一,例如 php:7.4-cli-alpine
,然后将最新的 Composer 安装到该映像中。这将使您更好地控制图像中运行的 PHP 版本,并且稍后复制此图像以基于 8.0 进行升级测试将非常容易。