即使加载了循环模块,容器中也没有循环设备

即使加载了循环模块,容器中也没有循环设备

我正在尝试使从容器内制作和安装循环设备成为可能。这恰好适用于我自己的开发系统,但无法在我们的构建服务器上运行,而必须在该服务器上进行自动构建。

我确保将容器启动为privileged.我的容器起始行:docker run --privileged -it --rm <my_build_image>:latest /bin/bash.从容器内我尝试以下步骤来自 Lostup 手册页

# dd if=/dev/zero of=/var/tmp/file.img bs=1024k count=4
...
# losetup --show --find /var/tmp/file.img
...

这应该为我提供下一个未使用的循环设备并将其关联到 /dev/loopn。然而,我却看到了以下内容(并显示循环模块已加载并/dev/loop-control存在):

[root@64a3a6900e0d /]# losetup --show --find /var/tmp/file.img
losetup: Could not find any loop device. Maybe this kernel does not know
       about the loop device? (If so, recompile or `modprobe loop`.)
[root@64a3a6900e0d /]# ls /dev/loop*
/dev/loop-control
[root@64a3a6900e0d /]# lsmod | grep loop
loop                   28072  0

在我自己的开发盒上,这是可行的。我loop以特权加载并启动了容器,并且能够制作循环设备。我现在应该检查什么?

答案1

我有一个解决问题的方法。一些问题是,虽然我不是 docker 新手,但我还不是一个经验丰富的 docker 用户。我认为当容器生成时,/dev当时存在的目录会以某种方式映射到容器中。我认为这是目录的“实时”描述,/dev但事实并非如此。如果没有/dev/loop#文件,则即使容器具有特权,也不允许存在任何文件。

因此,解决方案是在 Jenkins 管道中,在生成容器之前,有一个阶段来安排/dev/loop#创建文件。然后,容器被生成并且/dev/loop#可用。

相关内容