所以我用保险丝安装了这个远程文件夹/mnt/shared
。它大部分是可用的,除了偶尔会有一些断开连接。
当重新连接发生时,实际安装的文件夹/mnt/shared
再次可用。
问题是,我把这个文件夹放在一个docker卷中,使它可以用于我的应用程序:/shared
。当我启动容器时,卷是可用的。
但是,如果在两者之间发生断开连接,而主机上的/mnt/shared
repo可用,则无法从容器访问/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
,这会给我的应用程序带来停机时间,因此这不是一个可接受的解决方案。
所以我的问题是:
当挂载的文件夹再次可用时,这是否是一个docker"错误"?
我可以手动执行此任务,而不必重新启动整个容器吗?
感谢
我会尝试以下解决方案。
如果你像这样把卷装到你的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文档