目前,我可以在我的开发机器上构建 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
...但您的需求可能不同。