我有三个文件:
Dockerfile:
FROM php:7.2-apache
COPY src/ /var/www/html
EXPOSE 80
docker-compose.yml:
version: '3'
services:
hello-world:
build: .
volumes:
- ./src:/var/www/html
ports:
- 80:80
src / index.php:
<?php
echo "Hello World!";
?>
然后我运行命令:
docker-compose up
到目前为止,一切都很好,但是当我在浏览器中访问localhost时,会得到:
403禁止 您无权访问此服务器上的/。
...并从容器中收到错误消息:
无法提供目录/ var / www / html /:找不到匹配的DirectoryIndex(index.php,index.html),并且Options指令禁止服务器生成的目录索引
但是,如果我从docker-compose.yml文件中删除了两行:
volumes:
- ./src:/var/www/html
...一切正常(除非未安装文件夹)。我究竟做错了什么?显然,它不喜欢我装入该卷,导致目录/ var / www / html /为空,但是为什么?
答案 0 :(得分:0)
在构建文件中,您正在将src的内容复制到映像中(在/var/www/html
下)。 src目录是构建上下文的一部分,并且必须位于“ build”根目录下。这可能是您从其中运行docker build命令的地方,通常是dockerfile
居住的地方。
在撰写文件中,您将src
目录映射到/var/www/html
的顶部,并在运行时将其内容替换为src
。
我猜您实际上只是想做这两件事之一。两者都可以,取决于您要实现的目标,但是根据您的报告,看起来您运行docker-compose up
的位置的目录src
为空,因此会出现错误消息。要解决此问题,请使用您要提供服务的目录的绝对路径,或者删除该容器的volumes
定义。
一种检查方法(假设您标记了图像HelloWorld
):
docker run -it -d --name helloworld -p 80:80 HelloWorld
然后,docker ps
仅用于检查它是否正在运行。如果一切正常,请尝试以下操作:
docker exec -it -w /var/www/html helloworld ls -gAlFh
这应该为您提供该目录中内容的列表。您也可以尝试以下方法:
docker exec -it -w /var/www/html helloworld sh
要在该目录中获取外壳程序,以便您可以更轻松地进行浏览。