尝试运行"comitted" Docker 映像,获取"cannot mount volume over existing file, file exists"



我正在开发一个Docker镜像。我从一个基本图像开始,并使用bash在其中交互工作。我安装了很多东西,安装(包括编译大量代码(花了20多分钟,所以为了节省我的工作,我使用了:

$ docker commit 0f08ac958391 myproject:wip

现在,当我尝试运行图像时:

$ docker run --rm -it myproject:wip
docker: Error response from daemon: cannot mount volume over existing file, file exists /var/lib/docker/overlay2/95aa9a9ea7cc0b1ba302adbd287e4d7059ee4fbe64183404df3bc65df332ee63/merged/run/host-services/ssh-auth.sock.

发生了什么事?我该如何解决这个问题?

关于相关/重复问题的注意事项:虽然还有其他关于此错误消息的问题,但没有一个答案可以直接解释为什么在这种情况下会发生错误,或者该怎么办。事实上,大多数问题根本没有答案。

当我运行基本映像时,我包含了SSH代理套接字的装载:

$ docker run --rm -it -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock myproject:dev /bin/bash

此绑定将主机(实际上是Docker守护进程VM(的文件装载到Docker容器中的file。当我提交正在运行的映像时,该映像包含文件/run/host-services/ssh-auth.sock。该图像还包含对/run/host-services/ssh-auth.sock的空体积引用。这意味着当我运行时

$ docker run --rm -it myproject:wip

这相当于运行

$ docker run -v /run/host-services/ssh-auth.sock --rm -it myproject:wip

不幸的是,该命令所做的是创建一个匿名卷,并将其装载到容器中的目录/run/host-services/ssh-auth.sock中。如果容器有这样的目录,或者即使没有,这也会起作用。导致它失败的原因是目标名称被文件占用。Docker不会在文件上装载卷。

解决方案是显式地提供从主机文件到目标卷的映射。任何主机文件都可以,但在我的情况下,最好使用原始文件。所以这是有效的:

docker run --rm -it -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock myproject:wip

最新更新