varrunCommand=cli.Command{Name:"run",Usage:`Create a container with namespace and cgroups limit
mydocker run -it [command]`,Flags:[]cli.Flag{cli.BoolFlag{Name:"it",// 简单起见,这里把 -i 和 -t 参数合并成一个Usage:"enable tty",},cli.BoolFlag{Name:"d",Usage:"detach container",},// 省略其他代码},/*
这里是run命令执行的真正函数。
1.判断参数是否包含command
2.获取用户指定的command
3.调用Run function去准备启动容器:
*/Action:func(context*cli.Context)error{iflen(context.Args())<1{returnfmt.Errorf("missing container command")}varcmdArray[]stringfor_,arg:=rangecontext.Args(){cmdArray=append(cmdArray,arg)}// tty和detach只能同时生效一个tty:=context.Bool("it")detach:=context.Bool("d")iftty&&detach{returnfmt.Errorf("it and d paramter can not both provided")}resConf:=&subsystems.ResourceConfig{MemoryLimit:context.String("mem"),CpuSet:context.String("cpuset"),CpuCfsQuota:context.Int("cpu"),}volume:=context.String("v")Run(tty,cmdArray,resConf,volume)returnnil},}
root@mydocker:~/feat-run-d/mydocker# go build .
root@mydocker:~/feat-run-d/mydocker# ./mydocker run -d top
{"level":"info","msg":"createTty false","time":"2024-01-24T16:58:16+08:00"}{"level":"info","msg":"resConf:\u0026{ 0 }","time":"2024-01-24T16:58:16+08:00"}{"level":"info","msg":"busybox:/root/busybox busybox.tar:/root/busybox.tar","time":"2024-01-24T16:58:16+08:00"}{"level":"info","msg":"mount overlayfs: [/usr/bin/mount -t overlay overlay -o lowerdir=/root/busybox,upperdir=/root/upper,workdir=/root/work /root/merged]","time":"2024-01-24T16:58:16+08:00"}{"level":"info","msg":"command all is top","time":"2024-01-24T16:58:16+08:00"}
可以看到,mydocker 命令直接退出了。
使用 top 作为容器内前台进程。然后在宿主机上执行 ps -ef 看一下 建的容器进程是否存在:
1
2
3
root@mydocker:~/feat-run-d/mydocker# ps -ef|grep -e PPID -e top
UID PID PPID C STIME TTY TIME CMD
root 16663710 16:5 pts/8 00:00:00 top