如何将 chrooted 目录作为 docker 容器启动?

How to start a chrooted directory as a docker container?

假设我有一个目录,例如 /demoenv。我想在其中启动一个二进制文件作为 docker 容器。

本质上,它可以像 chroot 一样工作,但具有 docker 容器提供的许多额外功能(以及许多缺点)。

在这种情况下,如果它不能参与非常有用的 docker image/container 提交机制,那绝对不是问题(我有一个备用解决方案)。

我能以某种方式做到吗?

docker: Error response from daemon: Invalid bind mount spec "/demoenv:/": Invalid specification: destination can't be '/' in '/demoenv:/'.

我终于找到了解决方法。

不幸的是,简单地挂载“/”(使用 Dockerfile 中的 VOLUME 命令,或者将 -v 赋予 docker run)不起作用 - 它不能' t 将根目录挂载为卷。

此外,Dockerfile 中的 VOLUME 似乎根本不起作用。

最佳(或最差)解决方案可以做什么:将子目录安装为不同的卷。左右:

docker run -d -h demobox --name demobox \
    -v /demobox/bin:/bin \
    -v /demobox/boot:/boot \
    -v /demobox/etc:/etc \
    -v /demobox/home:/home \
    -v /demobox/lib:/lib \
    -v /demobox/opt:/opt\
    -v /demobox/root:/root\
    -v /demobox/sbin:/sbin\
    -v /demobox/srv:/srv\
    -v /demobox/usr:/usr\
    -v /demobox/var:/var \
    demobox

不幸的是,它还需要一个伪造的图像 运行(它是 "fake" 因为它的所有相关 /* 目录将被 docker守护进程)。您可以为此使用任何东西(我使用了发行版的默认图像)。

附加信息:作为入口点,我们还可以给容器 /sbin/init。在我的尝试中,systemd 无法在其中 运行,但 upstart 可以 (apt-get install upstart)。将 /sbin/init 作为 ENTRYPOINTDockerfile,然后在启动容器后调用 telinit 3,我们基本上可以 运行 一个 docker 容器作为虚拟服务器。