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

时间:2016-11-16 15:59:20

标签: linux docker chroot

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

基本上,它可以像chroot一样工作,但具有众多额外功能(并且具有众多缺点),这是Docker容器提供的功能。

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

我可以以某种方式做到吗?

  • 我的第一个麻烦是,在这种情况下,我真的没有图像可以开始。
  • 我的第二个问题是-v卷挂载选项(docker run的参数)禁止使用以下消息挂载根分区:

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

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方法。

不幸的是,只需安装" /" (使用Dockerfile中的VOLUME命令,或者将-v提供给docker run)不起作用 - 它不能将根目录挂载为卷

此外,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

不幸的是,它还需要运行一个假图像(它是"假的"因为所有相关的/*目录都将由docker守护程序过载。)你可以使用任何东西(我使用了发行版的默认图像)。

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