containerd 源码分析:创建 container(二)
文接 containerd 源码分析:创建 container(一) 创建容器进程 创建 container 成功后,接着创建 task, task 将根据 container metadata 创建容器进程。 创建 task 进入 tasks.Newtask 创建 task: 1// containerd/cmd/ctr/commands/tasks/tasks_unix.go 2func NewTask(ctx gocontext.Context, client *containerd.Client, container containerd.Container, checkpoint string, con console.Console, nullIO bool, logURI string, ioOpts []cio.Opt, opts ...containerd.NewTaskOpts) (containerd.Task, error) { 3 ... 4 t, err := container.NewTask(ctx, ioCreator, opts...) 5 if err != nil { 6 return nil, err 7 } 8 ... 9} 10 11// containerd/client/container.go 12func (c *container) NewTask(ctx context.Context, ioCreate cio.Creator, opts ...NewTaskOpts) (_ Task, err error) { 13 ... 14 t := &task{ 15 client: c.client, 16 io: i, 17 id: c.id, 18 c: c, 19 } 20 ... 21 response, err := c.client.TaskService().Create(ctx, request) 22 if err != nil { 23 return nil, errdefs.FromGRPC(err) 24 } 25 t.pid = response.Pid 26 return t, nil 27} 类似创建 container,这里调用 container.client.TaskService().Create 创建 task: ...