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