1、// cri-o/server/container.go

// CreateContainer creates a new container in specified PodSandbox

func (s *Server) CreateContainer(ctx context.Context, req
*pb.CreateContainerRequest) (res *pb.CreateContainerResponse, err
error)

(1)、首先调用sbID := req.GetPodSandboxId(),sandboxID, err :=
s.podIDIndex.Get(sbID),sb :=
s.getSandbox(sandboxID)等同样多级函数得到sandbox实例

(2)、再调用containerConfig := req.GetConfig(),name :=
containerConfig.GetMetadata().GetName(),attempt :=
containerConfig.GetMetadata().GetAttempt()和containerID, containerName,
err := s.generateContainerIDandName(sb.name, name, attempt),成立容器ID

(3)、创设容器目录containerDir :=
filepath.Join(s.runtime.ContainerDir(), containerID)

(4)、调用container, err := s.createSandboxContainer(containerID,
containerName, sb, req.GetSandboxConfig(), containerDir,
containerConfig)

(5)、再调用
s.runtime.CreateContainer(container)和s.runtime.UpdateStatus(container)

(6)、最后,调用s.addContainer(container)和s.ctrIDIndex.Add(containerID)将容器在数据库

 

2、// cri-o/server/container.go

func (s *Server) createSandboxContainer(containerID string,
containerName string, sb *sandbox, SandboxConfig *pb.PodSandboxConfig
containerDir string, containerConfig *pb.ContainerConfig)
(*oci.Container, error)

(1)、首先调用specgen := generate.New()调用暴发一个默认spec的spec暴发器

(2)、再按照部署文件队specgen举办安装

(3)、调用podInfraState :=
s.runtime.ContainerStatus(sb.infraContainer),获取infra容器的信,首要正对的是ipc
namespace和network
namespace,nsPath也”/proc/pid/ns/net”,最终调用specgen.AddOrReplaceLinuxNamespace(nsType,
nsPath)

(4)、调用specgen.SaveToFile(filepath.Join(containerDir,
“config.json”))将spec保存进config.json文件中

(5)、调用imageSpec := containerConfig.GetImage()和image :=
imageSpec.GetImage()获取镜像名,接着调用utils.CreateFakeRootfs(containerDir,
image)创立根文件系统

(5)、最终调用并赶回 container, err := oci.NewContainer(containerID,
containerName, containerDir, logPath, labels, metadata, sb.id,
containerConfig.GetTty())

 

相关文章

网站地图xml地图