【问题标题】:Cannot mount volume in docker无法在 docker 中挂载卷
【发布时间】:2017-09-19 18:49:18
【问题描述】:

我正在尝试使用 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": ""
    }
],

我在运行 Ubuntu 14.04 的 vagrant box 上运行 docker-compose。

任何帮助将不胜感激,我已经走到了尽头。谢谢!

【问题讨论】:

    标签: php linux docker vagrant ubuntu-14.04


    【解决方案1】:

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

    在构建时,您将COPYADD 将此目录添加到映像中,而不是安装卷。在RUN 命令之前,您可以在 Dockerfile 中包含类似的内容:

    COPY . /contracts
    

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

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

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

    【讨论】:

    • 感谢您的回复。我能够像这样获得我的配置脚本。但是,在我按照您的建议尝试docker exec -it $container_id ls /contracts 之后,它仍然没有挂载(该位置仅存在“provision”目录)。我现在在没有流浪汉的情况下在本地尝试它。有什么想法吗?
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多