![在 Docker 容器中使用自动挂载的 USB 驱动器](https://linux22.com/image/719438/%E5%9C%A8%20Docker%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%E7%9A%84%20USB%20%E9%A9%B1%E5%8A%A8%E5%99%A8.png)
/media/<user>/<drive>
使用 Ubuntu,USB 驱动器在插入时会自动挂载。我想利用此功能使新连接的 USB 驱动器在正在运行的 Docker 容器中可用。所以我过去常常-v /media/<user>:/media/<user>
将 USB 挂载点的整个父目录挂载到容器上。
如果 USB 驱动器已连接,则此方法有效前容器启动。在这种情况下,USB 挂载点具有权限0777
并属于<user>
。如果在容器启动时连接了 USB 驱动器已经运行,挂载点出现在容器中但具有权限0700
并且归所有root
!
有人能解释一下这里可能发生的事情吗?我可以想象,USB 驱动器默认自动安装为0700
属于root
,然后其他一些机制启动将其更改为0777
和<user>
。只有更改不会被 Docker 接受。这是真的吗?
我已经查阅了大量论坛帖子和邮件列表,但还是无法弄清楚这个机制。我还尝试了一些 udev 规则(例如这个),但这些都没有效果。
答案1
我知道这个问题是 2018 年出现的,但解决方案是使用绑定挂载并将“绑定传播”设置为“共享”(不适用于卷)。
代替:
-v /media/<user>:/media/<user>
使用:
--mount type=bind,source=/media/<user>,target=/media/<user>,bind-propagation=shared
有关绑定传播的更多信息:https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation
答案2
rshared
原始挂载的子挂载会暴露给副本挂载,而副本挂载的子挂载也会传播到原始挂载。但传播还会扩展到嵌套在任何原始挂载点或副本挂载点内的挂载点。
docker run -v /media/$(whoami):/storage:rshared -it ubuntu bash
有关自动挂载的更多信息:
https://github.com/moby/moby/issues/32512
https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation