无论如何使用自定义 php 的 docker composer 图像?
Posted
技术标签:
【中文标题】无论如何使用自定义 php 的 docker composer 图像?【英文标题】:Is there anyway to use docker composer image with custom php? 【发布时间】:2022-01-22 06:50:39 【问题描述】:我想在我的 laravel 应用程序中使用多级 dockerfile 中的 docker composer 镜像来减小它的大小。我的依赖项需要 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
【问题讨论】:
您可以找到使用 7.4 构建的旧版本并明确标记该版本,而不是composer:latest
。或者将您的图像基于alpine:latest
(目前在其应用程序存储库中使用7.4)然后apk add php-cli
,或者(可能最好)将您的图像基于php/7.4-cli-alpine
等PHP容器之一。
我使用了composer:1
,它也使用了PHP 8.1.1
。
composer:1
将使用最新的 1.*.* - 您可以使用特定版本“回到过去”,例如 composer:1.9.3
,它会为您提供 PHP 7.4.11。
看起来composer:1.10.19
是最后一个使用 PHP 7.4 的图像,它有 7.4.14。
@AlexHowansky 你是对的。这解决了问题。您能否将其发布在答案部分,以便我接受它作为正确答案?
【参考方案1】:
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 进行升级测试将非常容易。
【讨论】:
【参考方案2】:我最近遇到了这个问题,分两步解决了。
-
使用
platform
配置告诉作曲家使用指定版本的PHP。
告诉作曲家不要生成自动加载,并在最终图像或运行正确版本的 PHP 的图像中手动执行。
这最近成为一个问题,因为在 PHP 8.1 中,post-autoload-dump
开始抛出有关 Laravel 的 Collection
类的错误。后自动加载脚本正在运行 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
虽然我不能自信地说没有更好的选择来解决这个问题,但我希望这个答案能够解释为什么存在问题,并为您指明解决问题的正确方向.
【讨论】:
以上是关于无论如何使用自定义 php 的 docker composer 图像?的主要内容,如果未能解决你的问题,请参考以下文章
如何将文件夹从我的主机挂载到自定义 docker 映像,在目录中使用 Dockerfile 进行设置? [复制]
具有自定义 php.ini 文件设置的 Docker Wordpress 容器