保险丝上的docker卷:未连接传输端点



所以我用保险丝安装了这个远程文件夹/mnt/shared。它大部分是可用的,除了偶尔会有一些断开连接。

当重新连接发生时,实际安装的文件夹/mnt/shared再次可用。

问题是,我把这个文件夹放在一个docker卷中,使它可以用于我的应用程序:/shared。当我启动容器时,卷是可用的。

但是,如果在两者之间发生断开连接,而主机上的/mnt/sharedrepo可用,则无法从容器访问/shared文件夹,我得到:

user@machine:~$ docker exec -it e313ec554814 bash
root@e313ec554814:/app# ls /shared 
ls: cannot access '/shared': Transport endpoint is not connected

为了让它重新工作,我找到的唯一解决方案是docker restart e313ec554814,这会给我的应用程序带来停机时间,因此这不是一个可接受的解决方案。

所以我的问题是:

  1. 当挂载的文件夹再次可用时,这是否是一个docker"错误"?

  2. 我可以手动执行此任务,而不必重新启动整个容器吗?

感谢

我会尝试以下解决方案。

如果你像这样把卷装到你的docker上:

docker run -v /mnt/shared:/shared my-image

我会创建一个中间目录/mnt/base/shared,并将其安装到docker中,如下所示:

docker run -v /mnt/base/shared:/base/shared my-image

我还将调整我的代码以引用新路径或在容器内创建从/base/shared/shared的链接

解释:

问题是,当断开连接并在连接恢复后创建新目录时,主机上安装的目录/mnt/shared可能会被删除。但是,容器开始使用已删除的旧目录的目录映射运行。通过创建一个中间目录并映射到它,可以避免这个映射问题。

另一个可行的解决方案是使用bind-propagation=shared装载目录

例如:

--mount type=bind,source=/mnt/shared,target=/shared,bind-propagation=shared

参见解释bind-propogation的docker文档

最新更新