You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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相关设置。可以从正常运行的容器中拷贝默认配置到本地:
    # 用docker run启动容器后执行
    docker cp php80vdev:/etc/apache2/conf-enabled/php8.0.conf ./config/
    
    之后恢复Compose中的挂载配置即可。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 20:07:12