是否可以在docker容器中安装ISO?

pxu*_*xul 15 linux mount centos6 docker

我正在使用一个docker容器(基于官方的centos:6.4图像)来构建一个ISO,然后我需要安装和验证.我无法使用以下方式安装ISO:

sudo mount -o loop /path/to/iso /mnt
Run Code Online (Sandbox Code Playgroud)

得到:

mount: Could not find any loop device. Maybe this kernel does not know
   about the loop device? (If so, recompile or `modprobe loop'.)
Run Code Online (Sandbox Code Playgroud)

看起来内核已经编译而没有循环设备支持.是否可以构建支持循环设备的docker镜像?我找不到任何关于此的信息,但是,看看这个帖子似乎这可能是一个持续的主题.

我想知道是否有办法规避这种限制?

jpe*_*zzo 24

要在容器中安装ISO,您需要两件事:

  • 访问循环设备,
  • 安装文件系统的权限.

默认情况下,Docker会锁定这两件事; 这就是你收到错误信息的原因.

最简单的解决方案是以特权模式启动容器:

docker run --privileged ...
Run Code Online (Sandbox Code Playgroud)

更精细的解决方案是深入了解设备cgroup和容器功能,以提供所需的权限.

请注意,您不能将特权操作作为Dockerfile的一部分执行; 即如果您需要在Dockerfile中安装该ISO,您将无法执行此操作.

但是,我建议您查看Xorriso,特别是osirrox工具,它可以让您从ISO映像中提取文件,就像提取tar文件一样,无需任何特殊访问,例如:

osirrox -indev /path/to/iso -extract / /full-iso-contents
Run Code Online (Sandbox Code Playgroud)


pxu*_*xul 7

我觉得这不是一个解决我问题的好方法,但这是我暂时所做的,直到一个更理智的想法出现.

我的容器开始变成bash,从这个shell我可以使用以下命令添加循环设备:

# mknod /dev/loop0 -m0660 b 7 0
# mknod /dev/loop1 -m0660 b 7 1
...
# mknod /dev/loop9 -m0660 b 7 9
Run Code Online (Sandbox Code Playgroud)

现在,我有循环设备可用,所以我可以安装ISO.但是,我注意到第一个可用的循环设备是/dev/loop2:

bash-4.1# losetup -f
/dev/loop2
Run Code Online (Sandbox Code Playgroud)

这意味着loop0和loop1已经在使用中,这可以通过以下方式确认:

bash-4.1# losetup -a
/dev/loop0: [fd00]:1978974 (/dev/loop0)
/dev/loop1: [fd00]:1978975 (/dev/loop1)
/dev/loop2: [fd00]:2369514 (/path/to/my/iso)
Run Code Online (Sandbox Code Playgroud)

而且,这就是为什么我认为这个解决方案很糟糕,从容器外部:

12:36:02 $ losetup -a
/dev/loop0: []: (/var/lib/docker/devicemapper/devicemapper/data)
/dev/loop1: []: (/var/lib/docker/devicemapper/devicemapper/metadata)
/dev/loop2: []: (/path/to/my/iso)
Run Code Online (Sandbox Code Playgroud)

所以它看起来像我在容器中创建的前2个循环设备映射到容器外的loop0和loop1,这就是它们无法使用的原因.我想必须有一种方法来设置这些设备与devicemapper(由docker使用,看起来像),但我没有能够提供很多信息.

目前,这个解决方案对我来说没问题 - 我umount完成它时,我必须小心记住图像.

我知道这远不是一个理智的解决方案,所以如果其他人能够提出更好的计划,我会全神贯注.