基于phpdockerio/php:8.1-fpm构建却用PHP8.2,如何回退到8.1?
问题
在PHP-FPM Docker容器中运行项目时,构建容器后执行composer出现PHP扩展缺失错误,但Dockerfile已包含所需扩展。排查发现容器默认使用PHP8.2版本,手动修改/etc/alternatives中的软链接指向PHP8.1后恢复正常,但重新构建容器后该操作失效,需要更合理的解决方案。
问题确认
容器内执行命令验证当前PHP版本:
root@fee8cc9ff790:/application# php --version PHP 8.2.0 (cli) (built: Dec 8 2022 13:56:08) (NTS)
root@fee8cc9ff790:/application# which php /usr/bin/php
追踪软链接发现默认指向PHP8.2:
phar -> /usr/bin/phar8.2 phar.phar -> /usr/bin/phar.phar8.2 php -> /usr/bin/php8.2 phpdbg -> /usr/bin/phpdbg8.2
配置文件详情
docker-compose.yml
############################################################################### # Generated on docker.io # ############################################################################### version: '3.9' services: mailhog: image: 'mailhog/mailhog:latest' redis: image: 'redis:alpine' mysql: image: 'mysql:8.0.27' working_dir: /application platform: linux/amd64 environment: - MYSQL_ROOT_PASSWORD= - MYSQL_DATABASE= - MYSQL_USER= - MYSQL_PASSWORD= webserver: image: 'nginx:alpine' working_dir: /application volumes: - '.:/application' - './docker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf' php-fpm: build: docker/php-fpm working_dir: /application/ volumes: - '.:/application' - './docker/php-fpm/php-ini-overrides.ini:/etc/php/8.1/fpm/conf.d/99-overrides.ini' - './docker/php-fpm/php-ini-overrides.ini:/etc/php/8.1/cli/conf.d/99-overrides.ini'
docker-compose.override.yml
############################################################################### # Generated on phpdocker.io # ############################################################################### version: '3.9' services: mailhog: ports: - '8026:8025' mysql: ports: - '33061:3306' webserver: ports: - '801:80'
docker/php-fpm/Dockerfile
FROM phpdockerio/php:8.1-fpm WORKDIR "/application" RUN apt-get update; \ apt-get -y --no-install-recommends install \ git \ php-xdebug \ php8.1-mysql \ php8.1-sqlite \ mysql-client \ php8.1-redis; \ apt-get clean; \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
解决方案
1. 在Dockerfile中强制设置默认PHP版本为8.1
在Dockerfile的RUN指令中添加update-alternatives命令,构建容器时自动将系统默认的PHP工具指向8.1版本,彻底解决软链接漂移问题:
修改后的docker/php-fpm/Dockerfile:
FROM phpdockerio/php:8.1-fpm WORKDIR "/application" RUN apt-get update; \ apt-get -y --no-install-recommends install \ git \ php-xdebug \ php8.1-mysql \ php8.1-sqlite \ mysql-client \ php8.1-redis; \ # 固定默认PHP版本为8.1 update-alternatives --set php /usr/bin/php8.1; \ update-alternatives --set phar /usr/bin/phar8.1; \ update-alternatives --set phar.phar /usr/bin/phar.phar8.1; \ update-alternatives --set phpdbg /usr/bin/phpdbg8.1; \ apt-get clean; \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*
2. 锁定基础镜像版本避免漂移
部分基础镜像可能会自动更新系统包,导致意外安装更高版本PHP。可以指定带具体版本号的基础镜像标签,确保环境稳定:
将FROM phpdockerio/php:8.1-fpm替换为类似FROM phpdockerio/php:8.1.20-fpm的固定版本镜像(需根据镜像仓库的实际标签调整)。
3. 临时规避:直接指定PHP8.1执行composer
如果仅需解决composer执行问题,可直接调用PHP8.1的二进制文件执行命令,无需依赖默认软链接:
/usr/bin/php8.1 /usr/bin/composer install
此方法仅为临时方案,建议优先使用第一种方法从根源解决问题。
内容的提问来源于stack exchange,提问作者Jon White
相关产品推荐
相关产品推荐

