在最近一次部署一个新的 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