考虑我有一个目录,例如/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:/'.
答案 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容器作为虚拟服务器运行。