深究Runc源码-5-Exec流程分析
代码基于1.1.0
runc exec在容器中启动另一个进程。流程类似runc start和runc create的部分融合,首先类似runc start 通过getContainer重新构建Container实例,再根据命令行参数构建新Process实例,最后组成runner

例如执行runc exec mycontainer bash
Process实例如下,相较于create流程,Init字段为false
runner实例如下,相较于create流程,action为CT_ACT_RUN
runner.run流程同create,区别在于action为CT_ACT_RUN,流程走到了Container.Run

Container.Run流程如下,同create,流程走到了Container.Start,Container.Start流程中相较于create流程,区别在于流程都走到了Init false的分支


在构建parentProcess时,实例化的是setnsProcess,如下

setnsProcess 执行runc init流程同runc create,但区别是nsexec收到的config.cloneflags是0,config.namespaces是runc create时 runc init创建的namespaces,会调用join_namespaces setns将进程加入到 create时创建的namespaces,例如:
在newContainerInit逻辑中,根据initType==setns,实例化linuxSetnsInit对象,如下:
最后调用system.Execv执行Process
开源的东西,不需要说明出处,就说你自己写的