我对坞/容器相当陌生,并试图通过查看代码来更好地理解它。
看一下runC,它看起来就像以前的代码库中的nsinit一样使用dig容器,并且我试图用它作为一个起点来理解如何使用dig容器,以及更深入地了解dig容器的工作方式。
其中一件我觉得有点棘手的事情是引导过程和对nsexec的C代码的调用。
我确实广泛地理解,在调用应用程序(runC/libcontainer)将控制权移交给容器进程之前,需要对名称空间等进行一些初始化,但我似乎找不到对此的一步一步的好解释。有人知道这个地区有什么好医生吗?
我是否正确地假设,作为引导过程的一部分,C代码将使用"init“cmd行标志调用(克隆/子) runC?
发布于 2017-03-16 00:56:18
这是一个解释。你可以读本文件,但老实说,它有点过时了.实际上,这就是它的工作方式。
当您在Go程序中导入"github.com/opencontainers/runc/libcontainer/nsenter"时,我们有一些神奇的__attribute__内容,告诉Go编译器在运行时“引导”之前让nsexec运行。实际上,这意味着每次运行任何runC程序时,我们的代码(在github.com/opencontainers/runc/libcontainer/nsenter/nsexec.c中)都会在Go运行时开始之前运行。
当您运行正常的用户进程时,这段代码实际上不会做任何事情,只需要调用runC。但是,如果您的进程将是容器init进程(它有_LIBCONTAINER_INITPIPE环境变量集),那么它将从_LIBCONTAINER_INITPIPE指定的文件描述符读取大量配置信息,并相应地设置名称空间和其他内容。所有这些设置完成后,函数将返回,Go运行时将引导到runc init代码中,然后该代码将完成容器的设置。
所有这些代码都非常类似于libcontainer在runC拆分之前的工作方式。
发布于 2017-03-09 13:51:57
https://stackoverflow.com/questions/42696589
复制相似问题