深究Runc源碼-5-Exec流程分析
代碼基于1.1.0
runc exec在容器中啟動(dòng)另一個(gè)進(jìn)程。流程類似runc start和runc create的部分融合,首先類似runc start 通過(guò)getContainer重新構(gòu)建Container實(shí)例,再根據(jù)命令行參數(shù)構(gòu)建新Process實(shí)例,最后組成runner

例如執(zhí)行runc exec mycontainer bash
Process實(shí)例如下,相較于create流程,Init字段為false
runner實(shí)例如下,相較于create流程,action為CT_ACT_RUN
runner.run流程同create,區(qū)別在于action為CT_ACT_RUN,流程走到了Container.Run

Container.Run流程如下,同create,流程走到了Container.Start,Container.Start流程中相較于create流程,區(qū)別在于流程都走到了Init false的分支


在構(gòu)建parentProcess時(shí),實(shí)例化的是setnsProcess,如下

setnsProcess 執(zhí)行runc init流程同runc create,但區(qū)別是nsexec收到的config.cloneflags是0,config.namespaces是runc create時(shí) runc init創(chuàng)建的namespaces,會(huì)調(diào)用join_namespaces setns將進(jìn)程加入到 create時(shí)創(chuàng)建的namespaces,例如: ? ? ?
在newContainerInit邏輯中,根據(jù)initType==setns,實(shí)例化linuxSetnsInit對(duì)象,如下:
最后調(diào)用system.Execv執(zhí)行Process
開源的東西,不需要說(shuō)明出處,就說(shuō)你自己寫的