使用 Alpine 的 apk 命令安装 Composer 时使用了错误的 PHP 版本

And*_*rev 13 php composer-php docker alpine-linux

我有一个运行 8.0 的 docker 映像,想要升级到 8.1。我已更新图像以使用 PHP 8.1 运行,并希望更新其中的依赖项。

新图像源自php:8.1.1-fpm-alpine3.15

我已更新composer.json并更改require.php为,^8.1但在运行时遇到以下消息composer upgrade

Root composer.json requires php ^8.1 but your php version (8.0.14) does not satisfy that requirement.
Run Code Online (Sandbox Code Playgroud)

令我眼花缭乱的是,作曲家错误地识别了 PHP 版本。我使用两个命令来确定:

Root composer.json requires php ^8.1 but your php version (8.0.14) does not satisfy that requirement.
Run Code Online (Sandbox Code Playgroud)

到目前为止我已经尝试过:

  • 检查php -v
  • 清除作曲家缓存
  • 重建形象

作曲家版本 2.1.12 2021-11-09 16:02:04

which php # returns only /usr/local/bin/php
/usr/local/bin/php -v # returns PHP 8.1.1 (cli) (built: Dec 18 2021 01:38:53) (NTS)
Run Code Online (Sandbox Code Playgroud)

上述所有命令(不包括 docker 命令)都在容器中运行

Dockerfile:

composer check-platform-reqs | grep php
# returns:
# ...
# php                   8.0.14  project/name requires php (^8.1)                   failed  
Run Code Online (Sandbox Code Playgroud)

yiv*_*ivi 10

呵呵。这让我有点惊讶。

作曲家正确报告了它正在使用的 PHP 版本。问题是它没有使用“正确的”PHP 解释器。

出现此问题的原因在于您安装 Composer 的方式。

显然,通过apk add composer安装另一个版本的 PHP(您可以在 上找到它/usr/bin/php8,这是版本 8.0.14 上的版本)。

apk您可以手动安装,而不是让您为您安装 Composer。无论如何,没有什么需要安装的,不需要通过包管理器。特别是因为 PHP 尚未通过包管理器安装在您的基础映像上。

composer我刚刚从命令中删除了包含的行apk add --update,并将其添加到下面的某处:

 RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
     php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && \
     php composer-setup.php && \
     php -r "unlink('composer-setup.php');" && \
     mv composer.phar /usr/local/bin/composer;
Run Code Online (Sandbox Code Playgroud)

(实际的校验和会因版本而异,应该使用此页面中的适当校验和更新脚本,或者简单地使用获取最新校验和的脚本,如此处所述

您还可以简单地从此处下载最新的 Composer PHAR 文件,并将其添加到图像中,具体取决于您想要的方式。

现在有一个 PHP 版本,composer 将在 PHP 8.1.1 上正确运行。