《自己动手写Docker》笔记x04:构建容器进阶(1)

也不是半途而废,主要是学到这里时由于编程环境的差异和个人知识水平的限制,本地代码和书上代码执行结果出现了非常大的差异,同时这一章牵涉到非常多的Linux系统调用和基础知识,而我对它们又不太熟悉,所以对本书的学习只能暂时放弃,先去补习相关的基础知识。

5.1

只需要设置一个参数即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 父进程的运行指令
// cpt5-1-detach/main_command.go
var runCommand = cli.Command{
// ...
Flags: []cli.Flag{
cli.BoolFlag{
Name: "d",
Usage: "detach container",
},
// ....
Action: func(ctx *cli.Context) error {
// ....
createTty := ctx.Bool("ti")
detach := ctx.Bool("d")

// 两者不能共存
if createTty && detach {
return fmt.Errorf("ti and d paramter can not both provided")
}
// ....
}

然后做一个判断,是否需要等待

1
2
3
4
5
6
7
8
9
func Run(tty bool, cmdArr []string, res *subsystems.ResourceConfig, volumn string)  {
// ....
if tty {
if err := parent.Wait(); err != nil {
log.Fatal(err)
}
}
// ....
}

快速查看进程所在的进程树。从祖先到自己

1
ps | awk '$4=="top" {print $1}' | xargs pstree -spa

5.1中所说的有PID1接管是在完全的命令行界面,如果是图形化界面则会变成如下的进程树

1
2
3
4
5
systemd,1 splash
└─lightdm,1035
└─lightdm,1479 --session-child 12 19
└─upstart,2053 --user
└─top,10615

lightdm 是Linux和图形化界面有关的一个进程