将本地目录安装到Docker中的容器(docker卷)时出现问题。

时间:2018-09-03 21:00:51

标签: docker docker-compose dockerfile docker-volume

我有三个文件:

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 /为空,但是为什么?

1 个答案:

答案 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

要在该目录中获取外壳程序,以便您可以更轻松地进行浏览。