【问题标题】:Docker - cannot mount volume over existing file, file existsDocker - 无法在现有文件上挂载卷,文件存在
【发布时间】:2016-02-27 11:34:35
【问题描述】:

我正在尝试在 Docker 中为我的应用程序构建一个数据容器。我运行这个命令来公开一些卷:

docker run --name svenv.nl-data -v /etc/environment -v /etc/ssl/certs -v /var/lib/mysql -d svenv/svenv.nl-data

问题是我从这个命令得到这个错误:

Error response from daemon: cannot mount volume over existing file, file exists /var/lib/docker/aufs/mnt/aefa66cf55357e2e1e4f84c2d4d2d03fa2375c8900fe3c0e1e6bc02f13e54d05/etc/environment

如果我正确理解了 Docker 文档。支持为单个文件创建卷。所以我不明白为什么会出现这个错误。

有人可以给我解释一下吗?我在 Ubuntu 14.04 上运行 Docker 1.9.1。

【问题讨论】:

  • 你解决了吗?
  • 发现某些文件无法被 docker irrc 覆盖。它认为 /etc/environment 是保留的。

标签: ubuntu docker volumes


【解决方案1】:

你应该使用:

-v /etc/environment:/etc/environment

代替:

-v /etc/environment

前者将容器卷映射到主机卷。 后者尝试在/etc/environment 创建一个新卷,但由于该目录已经存在而失败。

【讨论】:

    【解决方案2】:

    我猜是因为您没有挂载文件,而是声明了挂载。试试这个符号:-v <full path to a file you want to overwrite the target with>:/etc/environment

    【讨论】:

    • 我不想用其他文件覆盖该文件。我想要实现的是将/etc/environment 标记为卷,以便另一个容器可以使用--volumes-from 来使用它。这甚至可能吗?
    【解决方案3】:

    假设你在Linux下,运行如下代码

    docker run -it --rm -v /local_dir:/image_root_dir/mount_dir image_name
    

    这里有一些细节:

    -it: interactive terminal 
    --rm: remove container after exit the container
    -v: volume or say mount your local directory to a volume
    

    由于挂载功能会“覆盖”映像中的目录,因此您应该始终在映像根目录下创建一个新目录。

    访问官方文档Use bind mounts获取更多信息。

    【讨论】:

      【解决方案4】:

      cannot mount volume over existing file 也可能意味着您正在尝试将主机中的 文件夹 挂载到容器中的 文件,这是一个逻辑错误。

      如果是这样,请将容器中的文件包装在一个文件夹中,然后挂载该文件夹而不是文件。

      【讨论】:

        【解决方案5】:

        对我来说,解决方案是删除图像并重建。不是一个好的解决方案,但它对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 2017-09-19
          • 2020-07-10
          • 2016-08-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多