如何授予 Docker 容器动态创建的环回设备的访问权限?

如何授予 Docker 容器动态创建的环回设备的访问权限?

我有一个小型 Docker 容器,可以从中访问 /dev/loop0。为此,我添加了docker run

--device=/dev/loop-control:/dev/loop-control \
--device=/dev/loop0:/dev/loop0 \

在此环回设备上,我使用 parted/fdisk 创建了两个或多个分区。

现在,我需要安装这两个分区,但不幸的是,我无法访问其中一个/dev/loop0p1/dev/loop0p2任何其他动态创建的分区。

有没有什么方法可以让我无需生成容器就可以访问它们--privileged

谢谢。

答案1

尽管这个问题很老了,但这仍然是一个问题。

Linux 内核不会将设备注册事件传播到容器,这就是为什么/dev/*在容器运行时添加的设备的文件不会出现在容器内。

作为容器内的解决方法,您可以查找丢失的设备文件并像以下 shell 脚本一样创建它们:

FILTER='^loop'
lsblk --raw -a --output "NAME,MAJ:MIN" --noheadings | grep -E "$FILTER" | while read LINE; do
    DEV=/dev/$(echo $LINE | cut -d' ' -f1)
    MAJMIN=$(echo $LINE | cut -d' ' -f2)
    MAJ=$(echo $MAJMIN | cut -d: -f1)
    MIN=$(echo $MAJMIN | cut -d: -f2)
    [ -b "$DEV" ] || mknod "$DEV" b $MAJ $MIN
done

(在我的案例中,我曾经FILTER='^(r|n)bd'匹配/dev/rbdX/dev/nbdX动态创建 ceph 的设备。)

请注意,上述脚本不会取消注册已在主机上移除的设备。如果您也需要这样做,也可以运行以下命令(FILTER需要指定):

find /dev -mindepth 1 -maxdepth 1 -type b | cut -d/ -f3 | grep -E "$FILTER" | sort > /tmp/devs-created
lsblk --raw -a --output "NAME" --noheadings | grep -E "$FILTER" | sort > /tmp/devs-available
for ORPHAN in $(comm -23 /tmp/devs-created /tmp/devs-available); do
    rm /dev/$ORPHAN
done

如果您的设备是动态创建的,您可能希望在容器内定期运行这两个脚本。

您仍然需要运行您的容器--privileged才能使用设备。

另请参阅此 moby 问题评论我的脚本基于。

相关内容