Apache / PHP Docker 容器只提供 PHP 源文件,并没有正确执行 PHP 文件

Apache / PHP Docker containers are just serving the PHP source files and not executing the PHP files correctly

我正在尝试通过 Docker 在本地环境中 运行 一个 Laravel 应用程序。我想为每个服务设置单独的容器,即 Apache、PHP、MySQL。我还想将 Composer、Artisan 和 PHPUnit 也放在不同的容器中。这比什么都重要。

所有容器都没有问题地旋转起来,我可以通过 'docker-compose exec [container name] /bin/sh' 命令毫无问题地访问每个容器。

我遇到的问题是 public 文件夹中的 index.php 没有被正确执行。 Apache 正在提供文件内容。

我不知道我做错了什么。我试过使用 Nginx 容器而不是 Apache,但我遇到了同样的问题。我猜我的 Apache 容器无法识别我的 PHP 容器。

下面是我做错了什么吗?

我的docker-compose.yml文件如下:

version: '3.8'

networks:
  cpw:
    name: cpw_network

services:
  apache:
    build:
      context: .
      dockerfile: apache.dockerfile
    container_name: cpw_apache
    depends_on:
      - php
      - mysql
    ports:
      - 8080:80
      - 8443:443
    volumes:
      - ./:/var/www/html
    networks:
      - cpw

  php:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: cpw_php
    volumes:
      - ./:/var/www/html
    networks:
      - cpw

  mysql:
    image: mysql:5.7.32
    container_name: cpw_mysql
    environment:
      MYSQL_DATABASE: cpw
      MYSQL_USER: laravel
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    networks:
      - cpw

  composer:
    image: composer:latest
    container_name: cpw_composer
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    networks:
      - cpw

  artisan:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: cpw_artisan
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    entrypoint: [ "php", "artisan" ]
    networks:
      - cpw

  phpunit:
    build:
      context: .
      dockerfile: php.dockerfile
    container_name: cpw_phpunit
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    entrypoint: [ "/var/www/html/vendor/bin/phpunit" ]
    networks:
      - cpw

我的apache.dockerfile如下:

FROM httpd:alpine

ADD ./apache/httpd-vhosts.conf /usr/local/apache2/conf/extra/httpd-vhosts.conf

RUN sed -i 's,#Include conf/extra/httpd-vhosts.conf,Include conf/extra/httpd-vhosts.conf,g' /usr/local/apache2/conf/httpd.conf

RUN mkdir -p /var/www/html

我的php.dockerfile如下:

FROM php:7.4.12-fpm-alpine
      
RUN mkdir -p /var/www/html
        
RUN apk --no-cache add shadow && usermod -u 1000 www-data
        
RUN docker-php-ext-install pdo pdo_mysql   

我的httpd-vhosts.conf如下:

<VirtualHost *:80>
    ServerAdmin email@email.com
    DocumentRoot /var/www/html/public
    ServerName localhost
    ServerAlias localhost
    ErrorLog logs/localhost-error_log
    CustomLog logs/localhost-access_log common

    <Directory /var/www/html/public>
        AllowOverride All
        DirectoryIndex index.php index.php
        Options -Indexes
        Require all granted
    </Directory>
</VirtualHost>

感谢任何帮助。

此致, 斯蒂芬

感谢@NicoHaase 为我指明了正确的方向。

这是我遗漏的部分:

  <FilesMatch \.php$>
    SetHandler "proxy:fcgi://php-fpm-container:9000"
  </FilesMatch>

此处有更多详细信息:

这也可能解决:

<FilesMatch \.(?i:php)$>
    SetHandler application/x-httpd-php
</FilesMatch>