Answers:
如果您使用的是systemd-nspawn,请使用--capability=CAP_MKNOD
命令行开关启动容器。这将允许您在容器内创建设备节点。然后创建一个像这样的循环设备:
# mknod /dev/loop0 b 7 0
请记住,此循环设备与主机共享,并在其中也被调用/dev/loop0
。现在,如果您知道主设备号和次设备号,便可以访问主机设备。我可能还没有想到其他后果。被警告。
--device-cgroup-rule="b 7:* rmw"
,docker run
以允许完全访问回送设备(但没有其他设备,因为没有--privilege
)。通过docs.docker.com/edge/engine/reference/commandline/create/…找到并在docker 18.06.1-ce上进行了测试(该文件声称仅适用于Docker Edge)
循环设备由内核模块提供。因此,您需要特殊的特权才能访问它们。您还需要将它们公开到您的容器中,或者您需要手动创建设备文件。
快速答案
docker run --privileged=true ...
替代
sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...
这几乎可以工作
docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...
但是我得到这个错误:
root@5c033d5f8625:/# sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only
有关更多信息,请参见此链接。
有关systemd-nspawn手册页的说明:
systemd-nspawn将对容器中各种内核接口的访问限制为只读,例如/ sys,/ proc / sys或/ sys / fs / selinux。网络接口和系统时钟不能在容器内更改。设备节点可能无法创建。无法重新启动主机系统,并且可能无法从容器内部加载内核模块。
--capability=CAP_MKNOD
仍然有效吗?对我来说,它似乎没有任何作用,我Operation not permitted
什至无法接受,因此该用户和该用户也是如此。