使用docker compose up启动php8.0-apache容器时PHP代码不执行,docker run正常
问题:Docker Compose启动PHP8.0-Apache容器时PHP代码不执行(直接显示文本),但Docker Run正常
环境与配置
Dockerfile
FROM php:8.0-apache # 安装依赖 RUN apt-get update && apt-get install -y \ libbz2-dev \ libzip-dev # 安装PHP扩展 RUN docker-php-ext-install bcmath bz2 calendar exif gettext iconv mysqli opcache pdo_mysql shmop sockets sysvmsg sysvsem sysvshm zip CMD ["apache2-foreground"]
Docker Compose配置
version: "3.2" services: php80vdev: image: php80vdev container_name: php80vdev restart: always #privileged: true volumes: # 网页挂载 - type: bind source: ./web target: /var/www/ # Apache配置挂载 - type: bind source: ./config target: /etc/apache2/conf-enabled/ ports: - 46200:80 #- 443:443 networks: php80vdev-net: ipv4_address: 172.21.2.10 db: image: mariadb container_name: php80vdev-db restart: always environment: MARIADB_ROOT_PASSWORD: MyDatabasePassword volumes: - type: bind source: ./db target: /var/lib/mysql ports: - 3306:3306 networks: php80vdev-net: ipv4_address: 172.21.2.20 networks: php80vdev-net: driver: bridge ipam: driver: default config: - subnet: 172.21.2.0/24
补充信息
- 基于
php:7.3-apache的同类镜像在Docker 20.10.16的生产服务器上可正常运行 - 测试服务器Docker版本为24.0.5
- 即使使用未安装额外模块的基础镜像,Docker Compose启动仍存在问题
排查与解决方法
1. 检查Apache配置挂载是否覆盖了PHP模块设置
你在Compose中把本地./config挂载到了容器的/etc/apache2/conf-enabled/,这个操作会替换容器内原有的Apache配置目录内容。官方php:apache镜像默认在该目录下有php8.0.conf等PHP相关配置,若本地./config为空或缺少这些配置,会导致Apache无法识别PHP文件。
解决步骤:
- 先注释掉Compose中的Apache配置挂载项,重启容器测试:
# - type: bind # source: ./config # target: /etc/apache2/conf-enabled/ - 如果问题解决,说明是挂载的配置丢失了PHP相关设置。可以从正常运行的容器中拷贝默认配置到本地:
之后恢复Compose中的挂载配置即可。# 用docker run启动容器后执行 docker cp php80vdev:/etc/apache2/conf-enabled/php8.0.conf ./config/
2. 检查网站根目录配置
官方php:apache镜像默认网站根目录是/var/www/html,但你把本地./web挂载到了/var/www/,如果./web中没有html子目录,Apache会找不到默认的index.php,或者需要调整DocumentRoot配置。
解决步骤:
- 要么修改挂载路径为
./web:/var/www/html - 要么在Apache配置中把
DocumentRoot改为/var/www,同时确保/var/www目录下有index.php,且Apache用户(默认www-data,UID=33)有读取权限。
3. 验证PHP模块是否启用
虽然官方镜像默认启用PHP模块,但如果挂载的配置覆盖了模块加载设置,可能导致模块未启用。进入容器检查:
# 进入Compose启动的容器 docker exec -it php80vdev bash # 检查模块状态 a2query -m php8.0
如果输出php8.0 (enabled by maintainer script)则正常,否则执行a2enmod php8.0启用模块,再重启Apache:service apache2 restart。
4. 处理Docker版本差异导致的挂载权限问题
Docker 24.0.x在绑定挂载的权限处理上与旧版本可能存在差异,确保本地./web目录允许容器内的www-data用户读取:
chown -R 33:33 ./web chmod -R 755 ./web
内容的提问来源于stack exchange,提问作者Frederico
相关产品推荐
相关产品推荐

