如何将 chrooted 目录作为 docker 容器启动?
How to start a chrooted directory as a docker container?
假设我有一个目录,例如 /demoenv
。我想在其中启动一个二进制文件作为 docker 容器。
本质上,它可以像 chroot 一样工作,但具有 docker 容器提供的许多额外功能(以及许多缺点)。
在这种情况下,如果它不能参与非常有用的 docker image/container 提交机制,那绝对不是问题(我有一个备用解决方案)。
我能以某种方式做到吗?
- 我的第一个麻烦是,在这种情况下,我真的没有图像可以启动。
- 我的第二个问题是
-v
卷安装选项(docker run
的参数)禁止使用以下消息安装根分区:
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
作为 ENTRYPOINT
给 Dockerfile
,然后在启动容器后调用 telinit 3
,我们基本上可以 运行 一个 docker 容器作为虚拟服务器。
假设我有一个目录,例如 /demoenv
。我想在其中启动一个二进制文件作为 docker 容器。
本质上,它可以像 chroot 一样工作,但具有 docker 容器提供的许多额外功能(以及许多缺点)。
在这种情况下,如果它不能参与非常有用的 docker image/container 提交机制,那绝对不是问题(我有一个备用解决方案)。
我能以某种方式做到吗?
- 我的第一个麻烦是,在这种情况下,我真的没有图像可以启动。
- 我的第二个问题是
-v
卷安装选项(docker run
的参数)禁止使用以下消息安装根分区:
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
作为 ENTRYPOINT
给 Dockerfile
,然后在启动容器后调用 telinit 3
,我们基本上可以 运行 一个 docker 容器作为虚拟服务器。