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

Posted

技术标签:

【中文标题】使用 Alpine 的 apk 命令安装 composer 时使用了错误的 PHP 版本【英文标题】:Wrong PHP version used when installing composer with Alpine's apk command 【发布时间】:2022-01-23 02:04:11 【问题描述】:

我有一个运行 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.

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

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)

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

检查php -v 清除作曲家缓存 重建映像

Composer 版本 2.1.12 2021-11-09 16:02:04

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

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

Dockerfile:

FROM php:8.1.1-fpm-alpine3.15

ENV TZ=Europe/London

# Install php lib deps
RUN apk update && apk upgrade
RUN apk add --update libzip-dev \
        zip \
        unzip \
        libpng-dev \
        nginx \
        supervisor \
        git \
        curl \
        shadow \
        composer \
        yarn && rm -rf /var/cache/apk/*

RUN usermod -u 1000 www-data
RUN usermod -d /var/www www-data

RUN mkdir -p /run/nginx && chown www-data:www-data /run/nginx

ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.9/supercronic-linux-amd64 \
    SUPERCRONIC=supercronic-linux-amd64 \
    SUPERCRONIC_SHA1SUM=5ddf8ea26b56d4a7ff6faecdd8966610d5cb9d85

RUN curl -fsSLO "$SUPERCRONIC_URL" \
 && echo "$SUPERCRONIC_SHA1SUM  $SUPERCRONIC" | sha1sum -c - \
 && chmod +x "$SUPERCRONIC" \
 && mv "$SUPERCRONIC" "/usr/local/bin/$SUPERCRONIC" \
 && ln -s "/usr/local/bin/$SUPERCRONIC" /usr/local/bin/supercronic

# Install and enable php extensions
RUN docker-php-ext-install sockets mysqli pdo_mysql zip gd bcmath > /dev/null

ARG ENV="development"
# Xdebug install
RUN if [ $ENV = "development" ] ; then \
        apk add --no-cache $PHPIZE_DEPS; \
        pecl install xdebug > /dev/null; \
        docker-php-ext-enable xdebug; \
        echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
        echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini; \
    fi ;

# Setup working directory
RUN chown -R www-data:www-data /var/www
WORKDIR /var/www
USER www-data


# Install dependencies
#RUN if [ $ENV = "development" ] ; then \
##        composer install -n; \
#    else \
##        composer install -n --no-dev; \
#    fi ;

# Generate doctrine proxies

【问题讨论】:

这是一个单阶段构建,我已编辑问题以添加 Dockerfile。我假设容器中没有安装 PHP 8.0.14 解释器,那么它如何使用呢? 你确定你重建了你的镜像并且正在使用这个 Dockerfile 代表的那个吗? docker build / docker-compose build 默认使用缓存层,确保使用--no-cache 进行重建(对 docker 和 docker-compose 都有效) 【参考方案1】:

嗯。这让我有点吃惊。

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

由于您安装作曲家的方式而出现问题。

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

您可以手动安装,而不是让apk 为您安装作曲家。无论如何都不需要安装它,不需要通过包管理器。特别是因为尚未通过基础映像上的包管理器安装 PHP。

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

 RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
     php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8')  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;

您也可以简单地从 here 下载最新的作曲家 PHAR 文件,并将其添加到图像中,具体取决于您想要的方式。

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

【讨论】:

哦,哇,我没想到作曲家会安装它自己的 PHP 依赖项。此处列出了所有依赖项 - pkgs.alpinelinux.org/package/edge/community/x86_64/composer

以上是关于使用 Alpine 的 apk 命令安装 composer 时使用了错误的 PHP 版本的主要内容,如果未能解决你的问题,请参考以下文章

alpine linux怎么安装文件

alpine linux怎么安装软件

alpine apk软件管理包常用命令总结

alpine apk软件管理包常用命令总结

Alpine Linux 中的 apk 命令讲解

Alpine镜像