Docker - 无法挂载卷到已存在的文件,文件已存在

21

我正在尝试为我的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。


你已经以某种方式解决了它吗? - Robert
发现一些文件无法被Docker覆盖,我认为/etc/environment是被保留的。 - Sven van de Scheur
5个回答

11

你应该使用:

-v /etc/environment:/etc/environment

代替:

-v /etc/environment

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


1
"

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

如果是这样,请将容器中的文件放在文件夹中,并挂载该文件夹,而不是文件本身。

"

1
嗯,这正是我遇到的问题...最终我使用了点作为当前文件夹,它起作用了。 - hocikto

1
假设您在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

由于mount函数会“覆盖”图像中的目录,因此您应始终在图像根目录下创建新目录。

访问官方文档使用绑定挂载以获取更多信息。


0

我想因为您没有挂载文件,而是声明了一个挂载点。请尝试使用以下表示法:-v <要覆盖目标的文件的完整路径>:/etc/environment


2
我不想用另一个文件覆盖这个文件。我的目标是将 /etc/environment 标记为卷,以便另一个容器可以使用 --volumes-from 命令。这是否可行? - Sven van de Scheur

0
对我来说,解决办法是移除图片并重新构建。虽然不是一个好的解决办法,但这是对我有效的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接