【问题标题】:debootstrap inside a docker container在 docker 容器内进行 debootstrap
【发布时间】:2014-12-11 22:00:53
【问题描述】:

这是我的问题:我想在 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(更干净)。有没有办法让它工作?

非常感谢!

【问题讨论】:

    标签: docker chroot


    【解决方案1】:

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

    fakechroot fakeroot debootstrap --variant=fakechroot ...
    

    干杯!

    【讨论】:

      【解决方案2】:

      不,目前不可能。

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

      【讨论】:

        【解决方案3】:

        --cap-add=SYS_ADMIN --security-opt apparmor:unconfined 添加到docker run 命令对我有用。

        moby/moby issue 16429

        【讨论】:

        • 结合 --privileged 标志或配置这将起作用,但 OP 已指定他们希望避免这种情况。
        【解决方案4】:

        这仍然不起作用(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】:

          debootstrap 版本1.0.107,自Debian 10 Buster(2019 年 7 月)或Debian 9 Stretch-Backports 可用,具有原生support for Docker,并允许构建 Debian 根映像而无需权限。

          • Dockerfile:
          FROM debian:buster-slim AS builder
          RUN apt-get -qq update \
          && apt-get -q install --assume-yes debootstrap
          ARG MIRROR=http://deb.debian.org/debian
          ARG SUITE=sid
          RUN debootstrap --variant=minbase "$SUITE" /work "$MIRROR"
          RUN chroot /work apt-get -q clean
          
          FROM scratch
          COPY --from=builder /work /
          CMD ["bash"]
          
          • docker build -t my-debian .
          • docker build -t my-debian:bullseye --build-arg SUITE=bullseye .

          【讨论】:

            【解决方案6】:

            有一个有趣的解决方法,但它涉及运行 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

            【讨论】:

              【解决方案7】:

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

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

              创建一个泊坞窗图像
              FROM scratch
              ADD rootfs.tar.xz /
              CMD ["/bin/bash"]
              

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

              【讨论】:

                【解决方案8】:

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

                Docker 是针对微服务的,并不是虚拟机的替代品。在一个容器中进行多个安装绝对不符合这一点。为什么不使用多个 docker 容器呢?

                【讨论】:

                • 我构建了一个在封闭环境中运行代码 sn-ps(主要是学生的练习解决方案)的应用程序。我同时运行了数百个 node.js 脚本,我发现最好的解决方案是 chroot+aufs(我最初尝试使用 docker 作为执行笼,但有一些限制,比如无法在控制器之间共享文件描述符进程和生成的笼中孩子,我用于 IPC)。我以前在 Virtualbox 机器上做这一切,但现在我试图利用很棒的 docker 生态系统(配置、部署等)。
                • 我不清楚你为什么说“文件描述符”而不是文件......但是你可以在具有共享卷的容器之间共享文件
                • 请回答问题,不要抱怨人们为什么需要这样做。有时你不能选择你的工具,需要做一些事情。有时您只是想了解它。
                猜你喜欢
                • 2022-10-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-04-06
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多