【问题标题】:Problem mounting local directory to container in docker (docker volumes).将本地目录安装到 docker(docker 卷)中的容器时出现问题。
【发布时间】:2018-09-03 21:00:50
【问题描述】:

我有三个文件:

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 文件中删除 2 行:

        volumes:
         - ./src:/var/www/html

...一切正常(文件夹未安装除外)。我究竟做错了什么?它显然不喜欢我挂载卷,导致目录 /var/www/html/ 为空,但为什么呢?

【问题讨论】:

  • 你在哪里安装了 docker(Linux、Windows、Mac)?如果是后两者,您主机上的路径是什么?您是否已执行到容器中并验证目录为空,或者只是权限被拒绝?

标签: docker docker-compose dockerfile docker-volume


【解决方案1】:

在您的构建文件中,您将 src 的内容复制到图像中(在/var/www/html 下)。 src 目录是构建上下文的一部分,并且必须位于“构建”根目录之下。这可能是您运行 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

在该目录中获取一个 shell,以便您可以更轻松地探索。

【讨论】:

  • 是的,这可行,我可以在 /var/www/html 文件夹中看到 index.php,并且可以在浏览器中访问该页面。那不是问题。我想挂载一个卷,这样每当我修改 php 文件时就不必重新构建映像,而且我似乎无法做到。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 2017-04-27
  • 2015-11-15
  • 2021-05-15
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多