在docker容器内debootstrap

时间:2014-10-16 13:45:08

标签: docker chroot

这是我的问题:我想在docker容器中构建一个chroot环境。问题是debootstrap无法运行,因为它无法在chroot中挂载proc:

W: Failure trying to run: chroot /var/chroot mount -t proc proc /proc

(在日志中问题证明是:mount: permission denied

如果我run --privileged容器,它(当然)有效...... 我真的非常想在Dockerfile中解压缩chroot(更清洁)。有没有办法让它发挥作用?

非常感谢!

7 个答案:

答案 0 :(得分:3)

不,目前无法实现。

Issue #1916(涉及在docker build期间运行特权操作)仍然是一个未解决的问题。有人在讨论中添加了一个命令行标志和RUNP命令,但这两个命令都没有实现。

答案 1 :(得分:2)

您可以使用debootstrap的fakechroot变体,如下所示:

fakechroot fakeroot debootstrap --variant=fakechroot ...

干杯!

答案 2 :(得分:1)

Adding --cap-add=SYS_ADMIN --security-opt apparmor:unconfined to the docker run command works for me.

See moby/moby issue 16429

答案 3 :(得分:0)

简短的回答,没有特权模式,没有办法。

Docker面向微服务,并不是虚拟机的替代品。在一个容器中安装多个安装肯定不一致。为什么不使用多个docker容器呢?

答案 4 :(得分:0)

这仍然不起作用(2018-05-31)。

目前唯一的选项是debootstrap,后跟docker import - Import from a local directory

# mkdir /path/to/target
# debootstrap bionic /path/to/target
# tar -C /path/to/target -c . | docker import - ubuntu:bionic

答案 5 :(得分:0)

有一个有趣的解决方法,但它涉及两次运行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运行的最后一步是让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

答案 6 :(得分:0)

这不能满足在没有设置 chroot 的容器中执行 --privileged 的 OP 要求,但它是一种可能有用的替代方法。

有关异构 rootfs 构建,请参阅 Docker Moby。它创建一个本地临时目录并使用需要 sudo 的 debootstrap 在其中创建一个 rootfs。然后它使用

创建一个docker镜像
FROM scratch
ADD rootfs.tar.xz /
CMD ["/bin/bash"]

这是在 docker 镜像中运行预制 rootfs 的常用方法。镜像构建完成后,不需要特殊权限。并且它得到了 docker 开发团队的支持。