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>
我正在尝试通过 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>