記一次 docker 容器中 composer 無法安裝擴展的問題

在最近一次部署一個新的 PHP 容器時,我編寫了一個 dockerfile 文件,其配置如下:

FROM php:8.2.23-fpm-alpine3.20

RUN apk add autoconf \
    gd \
    composer \
    freetype-dev \
    libjpeg-turbo \
    libjpeg-turbo-dev \
    libpng-dev \
    gcc \
    make \
    g++ \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install -j$(nproc) pdo_mysql

EXPOSE 9000

WORKDIR /var/www/html

在鏡像創建成功后,啟動了容器,這時候我去通過 composer 安裝一個項目,但是 composer 卻報錯了,提示缺少 PHP 擴展:

Your requirements could not be resolved to an installable set of packages.
Problem 1
- laravel/framework[v10.10.0, ..., v10.48.22] require ext-session * -> it is missing from your system. >Install >or enable PHP's session extension.
- Root composer.json requires laravel/framework ^10.10 -> satisfiable by laravel/framework[v10.10.0, ..., >v10.48.22].
To enable extensions, verify that they are enabled in your .ini files:
- /etc/php83/php.ini
- /etc/php83/conf.d/00_curl.ini
- /etc/php83/conf.d/00_iconv.ini
- /etc/php83/conf.d/00_mbstring.ini
- /etc/php83/conf.d/00_openssl.ini
- /etc/php83/conf.d/00_zip.ini
- /etc/php83/conf.d/01_phar.ini
You can also run php --ini in a terminal to see which files are used by PHP in CLI mode.
Alternatively, you can run Composer with --ignore-platform-req=ext-session to temporarily ignore these required extensions.

我通過 php -m 查看擴展,該有的擴展都有,嘗試了很多方法,不限于重新安裝 PHP 擴展、清除 composer 緩存、重新生成鏡像等,都沒有效果。在重新閱讀了報錯信息后,發現了一個關于 php83 這個目錄的提示,這里就很奇怪,我的鏡像是基于 php8.2 來做的,怎么會冒出一個 php8.3 版本的信息,最后在詢問了 GPT 之后,還是將問題聚焦在了 composer 上。首先檢查 composer 依賴的 PHP 版本,執行命令:

composer show --platform | grep php

php                  8.3.10   The PHP interpreter
php-64bit            8.3.10   The PHP interpreter, 64bit
php-ipv6             8.3.10   The PHP interpreter, with IPv6 support

到了這里突然想到了,這次的 composer 是通過 apk 直接以獨立的軟件包形式下載的,composer 依賴 PHP ,默認下載的 PHP 版本肯定都是最新的,這樣就造成了鏡像用到的 PHP 和 composer 依賴的 PHP 完全不是一個版本的,只需要更改 composer 的安裝方式,根據已有的 PHP 版本來下載對應的 composer 版本。

FROM php:8.2.23-fpm-alpine3.20

RUN apk add autoconf \
    gd \
    freetype-dev \
    libjpeg-turbo \
    libjpeg-turbo-dev \
    libpng-dev \
    gcc \
    make \
    g++ \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install -j$(nproc) pdo_mysql \
    && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

EXPOSE 9000

WORKDIR /var/www/html
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容