我有三个文件:
Dockerfile:
FROM php:7.2-apache
COPY src/ /var/www/html
EXPOSE 80
码头工人,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文件中删除了2行:
volumes:
- ./src:/var/www/html
...一切正常(除了没有安装文件夹)。我究竟做错了什么?它显然不喜欢我安装卷,导致目录/ var / www / html /为空,但为什么?
在构建文件中,您将src的内容复制到图像中(在/var/www/html
下)。 src目录是构建上下文的一部分,并且必须位于“构建”根目录下。这可能是您运行docker build命令的地方,通常是dockerfile
居住的地方。
在compose文件中,您将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
在该目录中获取shell,以便您可以更轻松地进行探索。