笔者关于Open Container Initiative (OCI) 的容器runtime实现runc源码的create和start流程进行了分析整理。
Create
create.go#createCommand
utils_linux.go#startContainer
- 根据容器id参数和spec信息用工厂模式创建了一个linux container实例。
- 对listen fd做一些初始化操作,用于socket activation?
- 构建一个runner对象,调用runner.run
utils_linux.go#run
这个run是 create、start、run三个命令入口公用的,下面主要描述create流程。
- 根据spec里面process的配置信息调用
newProcess
创建process对象。 - 将listen fd加入process的环境变量和需要在新进程保持打开的文件列表中(
ExtraFiles
)。 - 调用
setupIO
来进行io和tty相关配置,对于create来说,这里就是dup将当前进程的io,chown用户/组权限。 - 创建一个signalHandler来处理tty和signal。
- 调用
container.Start(process)
来启动process进程。 - 对于create来说,下面处理一下pid-file、tty回收等便返回了。