我正在开发 Docker 镜像。我从一个基本图像开始,并使用bash. 我安装了一堆东西,安装(包括编译大量代码)花了 20 多分钟,所以为了保存我的工作,我使用了:
$ docker commit 0f08ac958391 myproject:wip
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试运行图像时:
$ 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.
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?我该如何解决?
请注意相关/重复的问题:虽然还有关于此错误消息的其他问题,但没有一个答案直接解释为什么在这种情况下会发生错误或如何处理。事实上,大多数问题根本没有答案。
当我运行基础镜像时,我包含了 SSH 代理套接字的挂载:
$ docker run --rm -it -v /run/host-services/ssh-auth.sock:/run/host-services/ssh-auth.sock myproject:dev /bin/bash
Run Code Online (Sandbox Code Playgroud)
此绑定将文件从主机(实际上是 Docker 守护程序虚拟机)安装到Docker 容器中的文件。当我提交正在运行的映像时,该映像包含文件/run/host-services/ssh-auth.sock. 该图像还包含对 的空卷引用/run/host-services/ssh-auth.sock。这意味着当我跑的时候
$ docker run --rm -it myproject:wip
Run Code Online (Sandbox Code Playgroud)
相当于跑步
$ docker run -v /run/host-services/ssh-auth.sock --rm -it myproject:wip
Run Code Online (Sandbox Code Playgroud)
不幸的是,该命令的作用是创建一个匿名卷并将其安装到容器中的目录中。 /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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |