如何使用 docker 构建 chroot?

如何使用 docker 构建 chroot?

目前,我可以在我的开发机器上构建 Ubuntu 18.04 32 位 chroot,我想知道是否可以在 docker 容器内执行该过程。

我使用的流程:

  • 解压 ubuntu 基础镜像 ( ubuntu-base-18.04.3-base-i386.tar.gz)
  • 将文件resolve.conf从主机复制到解压的文件系统
  • 安装/sys,/proc/dev
  • 运行chroot /location/of/filesystem /bin/bash进入 chroot 并运行进一步设置
  • 完成后,我卸载所有内容并柏油/location/of/filesystem

是否可以在 docker 容器内执行相同的方法?

我没有看到任何关于能够从 docker 容器内挂载/卸载文件的信息。

答案1

我认为我最初遇到的问题是因为我如何编写由 docker 容器运行的脚本来创建 chroot。

可以在 docker 容器中创建 32 位 chroot。我必须运行一个特权容器,否则我无法将所需的目录/文件系统(例如/proc:)安装到 chroot(并且我会收到错误)。

我必须稍微修改一下我使用的步骤:

  • 我使用的 docker 命令是: docker run -t --rm --name "chrootTest" -v $(pwd):/root/<CHROOT_SCRIPT_DIR> --privileged --workdir /root/<CHROOT_SCRIPT_DIR> <IMAGE>:<TAG> ./build-chroot.sh <CHROOT_DIR_LOCATION>
  • 我不需要挂载/dev/sys进行 chroot 修改。 (修改包括删除目录/文件/符号链接和apt-get install-ing一些依赖项。我只需要挂载/proc这些操作,但如果您执行不同的操作,则可能需要挂载其他目录。
  • 该脚本将存档解压到<CHROOT_DIR_LOCATION>并将其resolve.conf从主机复制到解压的文件系统,同时还创建安装所需的任何目录。
  • 然后我有一个heredoc进入chroot并进行所需的设置 chroot "$CHROOT_DIR_LOCATION" /bin/bash <<'EOF' ... EOF
  • 设置完成后,我tar启动了 chroot 文件系统,并删除了 workdir <CHROOT_DIR_LOCATION>,脚本结束,并且 docker 容器被删除。

由于卷挂载,带有新创建的 chroot 的 tar 存档仍然存在于运行 docker 命令的主机上。

答案2

我使用 docker 对 Ubuntu 安装程序 Live CD 进行更改。它包含一个casper/filesystem.squashfs类似于chroot环境的东西;即,它是一个完整的根文件系统,在安装过程中写入目标文件系统。我进行如下更改filesystem.squashfs

# extract installer iso
$ osirrox -indev ubuntu-18.04.4-desktop-amd64.iso -extract ./ ./ubuntu-18.04.4-desktop-amd64.d

# extract filesystem squashfs
$ unsquashfs ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# create filesystem tarball
$ tar -cf squashfs-root.tar -C squashfs-root .

# create docker image 
$ docker image import squashfs-root.tar squashfs-root:latest

# create docker container, make changes inside
$ docker run --name squashfs-mine squashfs-root sh -c 'touch /etc/my.conf'

此时,现已停止的容器squashfs-mine包含原始文件系统,以及在其run.您现在可以export将容器的文件系统作为 tar 存档:

# extract filesystem tarball
$ docker export -o squashfs-mine.tar squashfs-mine

就我而言,我想filesystem.squashfs在原始*.iso内容中生成新内容并重新打包*.iso

# populate filesystem directory
$ tar -xf squashfs-mine.tar --one-top-level

# create filesystem squashfs
$ mksquashfs squashfs-mine ubuntu-18.04.4-desktop-amd64.d/casper/filesystem.squashfs

# re-pack iso
$ xorriso -as mkisofs ... -o ubuntu-18.04.4-desktop-amd64.iso ubuntu-18.04.4-desktop-amd64.d

...但您的需求可能不同。

相关内容