尝试 dockerize php Web 应用程序时未找到错误 404

问题描述 投票:0回答:1

我正在尝试对 php Web 应用程序进行 dockerize,但到目前为止还没有成功。 在我的项目的根目录中,我有一个名为 public 的文件夹,index.php 位于其中。 到目前为止,我创建了两个文件:docker-compose.yml 和 Dockerfile,它们都位于项目的根目录下。 docker-compose.yml 看起来像这样:

version: '3'
services:
  apache:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    restart: always
    ports:
      - '80:80'
    volumes:
      - ./public:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
    ports:
      - "3306:3306"

Dockerfile 看起来像这样:

FROM php:7.4-apache

WORKDIR /var/www/html

COPY ./public /var/www/html

RUN sed -i 's!/var/www/html!/var/www/html/p!g' /etc/apache2/sites-available/000-default.conf

RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install fileinfo

RUN a2enmod rewrite

EXPOSE 80

CMD ["apache2-foreground"]

我构建容器并启动它,当我访问 http://localhost/ 时,我得到:

Not Found
The requested URL was not found on this server.

有人知道我错过了什么吗?预先感谢。

php docker apache
1个回答
0
投票

由于您的

index.php
位于
public
文件夹内,因此您可能需要配置 Apache 以使用此文件夹作为文档根目录并启用重写模块。

Dockerfile:

FROM php:7.4-apache
WORKDIR /var/www/html
# Copy the entire project (including Dockerfile) to the image
COPY . /var/www/html
RUN a2enmod rewrite
COPY apache-config.conf /etc/apache2/sites-available/000-default.conf
RUN docker-php-ext-install pdo pdo_mysql fileinfo
EXPOSE 80
CMD ["apache2-foreground"]

docker-compose.yml:

version: '3'
services:
  apache:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    restart: always
    ports:
      - '80:80'
    volumes:
      - ./public:/var/www/html/public
    depends_on:
      - db

  db:
    image: mysql:8.0
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
    ports:
      - "3306:3306"

在项目的根目录中创建一个名为

apache-config.conf
的新文件:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

此配置将

DocumentRoot
设置为
/var/www/html/public
并允许在目录块中进行覆盖。现在应该考虑
.htaccess
文件夹中的
public
文件。

进行这些更改后,重建 Docker 容器并查看问题是否仍然存在。如果仍然不起作用,请检查 Apache 日志中是否有任何错误消息,这些消息可能会提供对问题的更多了解。

© www.soinside.com 2019 - 2024. All rights reserved.