有一个有趣的解决方法,但它涉及运行 Docker 两次。
第一次,使用像 ubuntu:latest 这样的标准 docker 镜像,只使用 --foreign 选项运行 debootstrap 的第一阶段。
debootstrap --foreign bionic /path/to/target
然后通过修改将在第二阶段使用的功能,不要让它做任何需要特权且无论如何都不需要的事情。
sed -i '/setup_devices ()/a return 0' /path/to/target/debootstrap/functions
sed -i '/setup_proc ()/a return 0' /path/to/target/functions
docker run 的最后一步是让 docker 执行 tar 到作为卷包含的目录。
tar --exclude='dev/*' -cvf /guestpath/to/volume/rootfs.tar -C /path/to/target .
好的,现在准备第二次运行。首先将您的 tar 文件加载为 docker 映像。
cat /hostpath/to/volume/rootfs.tar | docker import - my_image:latest
然后,使用 FROM my_image:latest 运行 docker 并运行第二个 debootstrap 阶段。
/debootstrap/debootstrap --second-stage
这可能有点迟钝,但它确实可以在不需要--priveledged 的情况下工作。您正在有效地用运行第二个 docker 容器替换运行 chroot。