在 Docker 容器中使用自动挂载的 USB 驱动器

在 Docker 容器中使用自动挂载的 USB 驱动器

/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

相关内容