无论如何使用自定义 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 进行设置? [复制]

docker php-fpm 一直重启问题处理

具有自定义 php.ini 文件设置的 Docker Wordpress 容器

如何在 codeigniter 控制器中访问自定义配置变量

filebeat采集k8s日志 - 软链接(自定义docker目录使用此方法)

docker 自定义镜像