无法在 docker 中装载卷

Cannot mount volume in docker

我正在尝试使用 docker-compose 将我的本地目录挂载到 docker 容器根目录下的一个新目录。据说这是一件很简单的事情。

这是我的 docker-compose 文件的样子:

version: '2'
services:
  web:
    build: ./docker/web/
    expose:
      - 80
    volumes:
      - .:/contracts

docker/web 中的 Dockerfile 字面上看起来是这样的(我打算以后做更多):

FROM php:5.6-apache
RUN /contracts/provision/web.sh

但我一直收到无法找到 web.sh 的错误。在我的 Dockerfile 中放置各种 ls 命令等表明容器上没有创建名为 "contracts" 的目录。如果我直接尝试使用现有的 mnt,我会得到相同的结果 - 目录仍然是空的。

但是 docker inspect 显示它显然已安装!

"Mounts": [
    {
        "Type": "bind",
        "Source": "/vagrant",
        "Destination": "/contracts",
        "Mode": "rw",
        "RW": true,
        "Propagation": ""
    }
],

我是运行 docker-写在一个流浪者盒子上运行 Ubuntu 14.04.

任何帮助将不胜感激,我已经筋疲力尽了。谢谢!

卷附加到容器,容器从镜像创建,镜像从构建命令创建。当您 运行 构建时,卷安装将不存在,因此您在 RUN 命令期间不会看到它。

在构建时,您可以 COPYADD 此目录到映像中,而不是安装卷。在 RUN 命令之前,您可以在 Docker 文件中包含这样的内容:

COPY . /contracts

请注意,如果您这样做并在运行时在同一位置安装一个卷,您将隐藏该位置图像中存在的任何内容。因此,将需要成为映像一部分的命令和脚本与需要成为持久卷一部分的数据分开,并且只将构建时脚本复制到映像中。

使用 运行 容器,您可以尝试 docker exec -it $container_id ls /contracts 看看它是否按预期存在。

如果该目录存在但为空,最可能的原因是如果您在 VM 或远程主机上有 docker 而您是来自不同环境的 运行 命令。该文件夹需要存在于 docker 主机 (VM) 本身上才能安装到容器中。 Docker for Win 和 Docker for Mac 具有将特定文件夹或驱动器共享到 VM 的设置,如果您在与预期不同的位置进行构建,则可能需要进行调整。并注意适用于 linux 文件名的区分大小写。