写点什么

自己动手写 Docker 系列 -- 5.6 实现删除容器

作者:
  • 2022 年 4 月 12 日
  • 本文字数:2983 字

    阅读完需:约 10 分钟

简介

在上篇中我们实现了 stop 命令,停止正在运行的容器,本篇将实现 rm 命令,删除已经停止的容器

源码说明

同时放到了 Gitee 和 Github 上,都可进行获取



本章节对应的版本标签是:5.6,防止后面代码过多,不好查看,可切换到标签版本进行查看

代码实现

实现该功能的主要思路如下:


这部分的实现可以说非常简单了,主要是找到容器的配置文件,将配置文件删除即可


因为我们的 ps 命令就是读取指定目录下的容器配置信息命令,进行容器列表展示的


我们把对应的容器的配置信息目录一删,就完事了

rm 命令添加

在 main.go 中添加相关的命令:


func main() {  ......    app.Commands = []cli.Command{    command.InitCommand,    command.RunCommand,    command.CommitCommand,    command.ListCommand,    command.LogCommand,    command.ExecCommand,    command.StopCommand,    command.RemoveCommand,  }  ......}
复制代码


在 main_command.go 中添加相关的命令:


var RemoveCommand = cli.Command{  Name:  "rm",  Usage: "remove container",  Action: func(context *cli.Context) {    if len(context.Args()) < 1 {      log.Errorf("missing container name")      return    }    containerName := context.Args().Get(0)    if err := run.RemoveContainer(containerName); err != nil {      log.Errorf("%v", err)    }  },}
复制代码

rm 命令的具体实现

根据容器名称,找到对应的容器目录,将其进行删除即可


新增 stop.go 文件


func StopContainer(containerName string) error {  pid, err := getContainerPidByName(containerName)  if err != nil {    return err  }
pidInt, err := strconv.Atoi(pid) if err != nil { return fmt.Errorf("convert pid %s to int err: %v", pid, err) }
if err := syscall.Kill(pidInt, syscall.SIGTERM); err != nil { return fmt.Errorf("send sigterm %d, err: %v", pid, err) }
containerInfo, err := getContainerInfoByName(containerName) if err != nil { return fmt.Errorf("get container info err: %v", err) }
containerInfo.Status = container.STOP containerInfo.Pid = "" newContainerInfo, err := json.Marshal(containerInfo) if err != nil { return fmt.Errorf("json marshal %v,err: %v", containerInfo, err) }
dirUrl := fmt.Sprintf(container.DefaultInfoLocation, containerName) configPath := dirUrl + container.ConfigName if err := ioutil.WriteFile(configPath, newContainerInfo, 0622); err != nil { return fmt.Errorf("write file %s err: %v", configPath, err) } return nil}
复制代码

测试运行

在上一篇的测试基础上,我们运行 rm 命令,看看是否对应的删除了


  • 启动一个后台运行的 top 命令容器

  • ps 查看状态:看到有一个预期的 running 的容器

  • 查看是否有对应的宿主机进程,看到有一个对应的 top 进程

  • 使用 stop 命令

  • ps 查看状态:看到已经停止了

  • 查看宿主机是否有 top 进程,看到没有了

  • 使用 rm 命令,删除进程

  • ps 查看,已经没有了


root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main run --name bird -d top                                                                                       ✔  ⚡  417  07:28:53{"level":"info","msg":"memory cgroup path: /sys/fs/cgroup/memory/mydocker-cgroup","time":"2022-04-09T07:29:00+08:00"}{"level":"info","msg":"memory cgroup path: /sys/fs/cgroup/memory/mydocker-cgroup","time":"2022-04-09T07:29:00+08:00"}{"level":"info","msg":"all command is : top","time":"2022-04-09T07:29:00+08:00"}{"level":"info","msg":"parent process run","time":"2022-04-09T07:29:00+08:00"}
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main ps  SIG(127) ↵  ⚡  418  07:29:00ID NAME PID STATUS COMMAND CREATED1808352378 bird 126298 running top 9000-04-04 00:00:00
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ps -ef|grep top  ✔  ⚡  419  07:29:05root 2751 1776 0 4月07 ? 00:00:01 /usr/libexec/xdg-desktop-portalroot 2778 1776 0 4月07 ? 00:00:00 /usr/libexec/xdg-desktop-portal-gtkroot 126298 1 0 07:28 pts/2 00:00:00 toproot 126537 22616 0 07:29 pts/2 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox top
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main stop bird  ✔  ⚡  420  07:29:09 root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main ps  ✔  ⚡  421  07:29:20ID NAME PID STATUS COMMAND CREATED1808352378 bird stop top 9000-04-04 00:00:00
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ps -ef|grep top  ✔  ⚡  422  07:29:24root 2751 1776 0 4月07 ? 00:00:01 /usr/libexec/xdg-desktop-portalroot 2778 1776 0 4月07 ? 00:00:00 /usr/libexec/xdg-desktop-portal-gtkroot 126883 22616 0 07:29 pts/2 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox top
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main rm bird  ✔  ⚡  423  07:29:26
root@lw-Code-01-Series-PF5NU1G  ~/code/go/dockerDemo   main ●  ./main ps  ✔  ⚡  424  07:40:56ID NAME PID STATUS COMMAND CREATED
复制代码


发布于: 刚刚阅读数: 4
用户头像

关注

还未添加个人签名 2018.09.09 加入

代码是门手艺活,也是门艺术活

评论

发布
暂无评论
自己动手写Docker系列 -- 5.6实现删除容器_Go_萧_InfoQ写作平台