Docker PHP 8.2-fpm-alpine容器无法安装PHP 8.2版本求助
问题:Docker容器内无法使用PHP 8.2,始终调用本地XAMPP的PHP 7.4
- 现有一个非本人搭建的PHP 7.2-fpm-alpine容器,依赖本地XAMPP的php.ini(对应PHP7.4版本),因其他项目依赖无法移除XAMPP
- 新项目基于Laravel9开发,需PHP8.2环境,尝试部署PHP8.2-fpm-alpine3.17容器,但执行PHP命令时始终调用本地XAMPP的PHP7.4,容器内
/usr/local/etc/目录为空,找不到PHP配置文件目录
本地执行PHP命令的输出
$ php --ini Configuration File (php.ini) Path: Loaded Configuration File: C:\xampp\php\php.ini Scan for additional .ini files in: (none) Additional .ini files parsed: (none)
$ php -v PHP 7.4.20 (cli) (built: Jun 1 2021 20:31:10) ( ZTS Visual C++ 2017 x64 ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies
我的Dockerfile内容
FROM php:8.2-fpm-alpine3.17 RUN apk update # Pull in nproc: RUN apk add --no-cache coreutils # Required for bandwidth graphs: RUN apk add --no-cache net-snmp-tools # Install the linux-headers package: RUN apk add --update linux-headers # ZIP: RUN apk add --no-cache libzip-dev zlib-dev RUN docker-php-ext-configure zip #--with-libzip RUN docker-php-ext-install -j "$(nproc)" zip # GMP: RUN apk add --no-cache gmp-dev RUN docker-php-ext-configure gmp RUN docker-php-ext-install -j "$(nproc)" gmp # GD: RUN apk add --no-cache libpng-dev RUN docker-php-ext-configure gd RUN docker-php-ext-install -j "$(nproc)" gd # MYSQL PDO DRIVER: RUN docker-php-ext-configure pdo_mysql RUN docker-php-ext-install -j "$(nproc)" pdo_mysql # XDEBUG: RUN apk add --no-cache $PHPIZE_DEPS RUN apk add php81-pecl-xdebug RUN apk add --update linux-headers #RUN MAKEFLAGS="-j $(nproc)" pecl install xdebug #RUN docker-php-ext-enable xdebug # Move php-fpm off of xdebug's port: RUN sed -i 's/9000/9003/' /usr/local/etc/php-fpm.d/zz-docker.conf RUN echo 'clear_env = no' >> /usr/local/etc/php-fpm.conf COPY . /var/www/studio WORKDIR /var/www/studio RUN php contrib/composer-installer \ --2 \ --filename composer \ --install-dir /usr/local/bin RUN addgroup -S art RUN adduser -G art -S art RUN chown -R art /var/www/studio RUN chgrp -R art /var/www/studio USER art RUN composer --no-interaction --profile -vvv install RUN composer check-platform-reqs #RUN php artisan passport:keys USER root # Cleanup RUN rm -f /usr/local/bin/composer RUN rm -f /usr/src/php.tar.xz RUN rm -f /usr/src/php.tar.xz.asc RUN rm -rf contrib RUN rm -rf /home/art/.composer USER art
我的docker-compose.yml内容
version: "3.8" x-env: &env APP_DEBUG_FILE: php://stdout DB_HOST: db DB_PORT: 3306 DB_DATABASE: artdb DB_USERNAME: local DB_PASSWORD: local x-php: &php init: true x-studio: &studio <<: *php environment: <<: *env x-tasks: &tasks <<: *php environment: <<: *env APP_ALERT_LOG: php://stdout APP_CONFTOOL_LOG: php://stdout APP_REPORT_LOG: php://stdout services: studio: <<: *php build: context: art/studio dockerfile: contrib/localhost-fpm.Dockerfile depends_on: - db environment: <<: *env volumes: - ./art/studio:/var/www/studio # Expose xdebug's port: ports: - 9000:9000 db: image: mariadb:10 environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_USER=local - MYSQL_PASSWORD=local - MYSQL_DATABASE=local volumes: - ./data:/docker-entrypoint-initdb.d ports: - 3306:3306 user: mysql nginx-studio: build: context: art/studio dockerfile: contrib/localhost-nginx.Dockerfile ports: - 8080:8080 depends_on: - studio
解决方案
1. 进入容器内部执行PHP命令
你当前看到的PHP版本是本地Windows主机的XAMPP环境,并非容器内的PHP。需先进入容器再执行命令:
# 查看容器名称,替换<container-name>为实际名称 docker ps docker exec -it <container-name> sh # 容器内执行 php -v php --ini
2. 修复Xdebug安装错误
Dockerfile中安装的php81-pecl-xdebug是适配系统PHP8.1的包,与容器内的PHP8.2不兼容,改用pecl安装对应版本:
# 替换原Xdebug代码块为: # XDEBUG: RUN apk add --no-cache $PHPIZE_DEPS linux-headers RUN pecl install xdebug-3.2.1 # 指定适配PHP8.2的Xdebug版本 RUN docker-php-ext-enable xdebug
3. 解决配置目录为空问题
官方php:8.2-fpm-alpine镜像默认会生成/usr/local/etc/php配置目录,为空可能是构建报错或挂载覆盖导致:
- 检查docker-compose是否挂载了
/usr/local/etc/php目录,若有则移除 - 重新构建镜像(避免缓存影响):
docker-compose build --no-cache studio
4. 统一端口配置
Dockerfile中将php-fpm端口改为9003,但docker-compose仍映射9000端口,二者需统一:
- 要么改回Dockerfile的端口为9000,要么修改docker-compose的ports为
9003:9003
5. 生成容器内PHP配置文件
进入容器后,若/usr/local/etc/php/php.ini不存在,可从模板生成:
cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini
6. 验证Laravel依赖
进入容器项目目录,执行命令确认依赖满足PHP8.2要求:
composer check-platform-reqs
内容的提问来源于stack exchange,提问作者scooby
相关产品推荐
相关产品推荐

