今天是最后一天了,我们最后将容器的停止,删除功能实现一下
容器停止
在上一节中,我们通过 config.json
记录了容器的基本信息,其中就有一个 status
字段用来记录容器的状态,和一个 PID
字段记录容器的 init
进程在宿主机上的 Pid
,我们停止容器,也就是将该 pid
进程杀死,并更新 status
状态即可
// 停止容器,修改容器状态
func StopContainer(containerName string) {
info, err := getContainerInfo(containerName)
if err != nil {
logrus.Errorf("get container info, err: %v", err)
return
}
if info.Pid != "" {
pid, _ := strconv.Atoi(info.Pid)
// 杀死进程
if err := syscall.Kill(pid, syscall.SIGTERM); err != nil {
logrus.Errorf("stop container, pid: %d, err: %v", pid, err)
return
}
// 修改容器状态
info.Status = common.Stop
info.Pid = ""
bs, _ := json.Marshal(info)
fileName := path.Join(common.DefaultContainerInfoPath, containerName, common.ContainerInfoFileName)
err := ioutil.WriteFile(fileName, bs, 0622)
if err != nil {
logrus.Errorf("write container config.json, err: %v", err)
}
}
}
删除容器
首先这里需要明确,我们是不能删除正在运行的容器的,也就是 status
为 Running
的容器,所以我们删除容器之前一定要先停止容器,然后我们将该容器生成的一系列文件夹删除即可
// 删除容器
func RemoveContainer(containerName string) {
info, err := getContainerInfo(containerName)
if err != nil {
logrus.Errorf("get container info, err: %v", err)
return
}
// 只能删除停止状态的容器
if info.Status != common.Stop {
logrus.Errorf("can't remove running container")
return
}
dir := path.Join(common.DefaultContainerInfoPath, containerName)
err = os.RemoveAll(dir)
if err != nil {
logrus.Errorf("remove container dir: %s, err: %v", dir, err)
return
}
}
转自:微信号 跟派大星学编程