在Docker容器中挂载Linux映像

8
为了一个项目,我需要在运行ubuntu的docker容器内挂载一个Linux镜像。我想要挂载的镜像是Raspbian。我需要访问该镜像的Linux文件系统并添加一个文件。
我通过使用卷标志来挂载文件夹来访问该镜像: docker run -it -v /path/to/image/folder:/default ubuntu /bin/bash 使用fdisk -l raspbian.img,我找到了偏移量:
Disk raspbian.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1

Device        Boot  Start     End Sectors  Size Id Type
raspbian.img1        8192  137215  129024   63M  c W95 FAT32 (LBA)
raspbian.img2      137216 2713599 2576384  1.2G 83 Linux

现在,当我尝试使用mount -o loop,offset=$((137216*512)) raspbian.img /mnt/来挂载镜像时,我得到了mount: /mnt/: mount failed: Unknown error -1。有人能解释一下我是否可以在正在运行的Docker容器中挂载Linux镜像,如果可以,应该如何操作吗? 编辑 在Vagrant中进行相同的挂载操作完全正常。 Docker挂载文件系统是否存在某些限制?

Raspbian旨在在裸机ARM硬件上运行,而不是在虚拟机中运行。此外,它需要ARM架构,您可能已经在其他平台上设置了docker / ubuntu,对吧? - Bernard
我知道。但是我想挂载镜像的文件系统。我不想启动Raspbian。 - k4l4m
1个回答

14

使用Docker挂载文件系统时有一些限制。

是的,标准的Docker容器有很多安全限制。正如您发现的那样,您无法挂载新的文件系统。您还无法修改容器的网络环境。

一种解决方法是在主机上执行挂载操作,然后使用-v参数将挂载的目录暴露到容器中,类似于:

# losetup -fP --show raspbian.img
/dev/loop0
# mount /dev/loop0p2 /mnt
# docker run -v /mnt:/raspbian ubuntu bash

但是如果您真的想在容器内执行挂载操作,您可以运行一个特权容器,使用--privileged选项来运行docker run命令。这将删除通常放置在Docker容器上的大部分限制:

  • 您将完全访问主机的/dev目录。
  • 您将能够挂载文件系统。
  • 您将能够在容器内修改网络配置。

例如:

# docker run -it --rm --privileged -v /images:/images ubuntu bash

现在我可以检查这张图片:

root@30f80d4598dc:/# fdisk -l /images/2016-09-23-raspbian-jessie-lite.img 
Disk /images/2016-09-23-raspbian-jessie-lite.img: 1.3 GiB, 1389363200 bytes, 2713600 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x5a7089a1

Device                                       Boot  Start     End Sectors  Size Id Type
/images/2016-09-23-raspbian-jessie-lite.img1        8192  137215  129024   63M  c W95 FAT
/images/2016-09-23-raspbian-jessie-lite.img2      137216 2713599 2576384  1.2G 83 Linux

并将其安装:

root@952a75f105ee:/# mount -o loop,offset=$((137216*512))  /images/2016-09-23-raspbian-jessie-lite.img /mnt
root@952a75f105ee:/# ls /mnt
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
root@952a75f105ee:/# 

太棒了!非常感谢。忘记了特权模式。 - k4l4m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接