自己动手写 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:00
ID NAME PID STATUS COMMAND CREATED
1808352378 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:05
root 2751 1776 0 4月07 ? 00:00:01 /usr/libexec/xdg-desktop-portal
root 2778 1776 0 4月07 ? 00:00:00 /usr/libexec/xdg-desktop-portal-gtk
root 126298 1 0 07:28 pts/2 00:00:00 top
root 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:20
ID NAME PID STATUS COMMAND CREATED
1808352378 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:24
root 2751 1776 0 4月07 ? 00:00:01 /usr/libexec/xdg-desktop-portal
root 2778 1776 0 4月07 ? 00:00:00 /usr/libexec/xdg-desktop-portal-gtk
root 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:56
ID NAME PID STATUS COMMAND CREATED
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【萧】的原创文章。
原文链接:【http://xie.infoq.cn/article/651677b9c9dd9f8909b27298b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
萧
关注
还未添加个人签名 2018.09.09 加入
代码是门手艺活,也是门艺术活
评论