funcremoveContainer(containerIdstring,forcebool){containerInfo,err:=getInfoByContainerId(containerId)iferr!=nil{log.Errorf("Get container %s info error %v",containerId,err)return}switchcontainerInfo.Status{casecontainer.STOP:// STOP 状态容器直接删除即可dirPath:=fmt.Sprintf(container.InfoLocFormat,containerId)iferr=os.RemoveAll(dirPath);err!=nil{log.Errorf("Remove file %s error %v",dirPath,err)return}casecontainer.RUNNING:// RUNNING 状态容器如果指定了 force 则先 stop 然后再删除if!force{log.Errorf("Couldn't remove running container [%s], Stop the container before attempting removal or"+" force remove",containerId)return}stopContainer(containerId)removeContainer(containerId,force)default:log.Errorf("Couldn't remove container,invalid status %s",containerInfo.Status)return}}
3. 测试
删除 STOP 状态容器
首先创建一个 detach 容器
1
2
3
4
5
6
7
8
9
10
root@mydocker:~/feat-rm/mydocker# go build .
root@mydocker:~/feat-rm/mydocker# ./mydocker run -d -name rm1 top
{"level":"info","msg":"createTty false","time":"2024-01-30T15:11:20+08:00"}{"level":"info","msg":"resConf:\u0026{ 0 }","time":"2024-01-30T15:11:20+08:00"}{"level":"info","msg":"busybox:/root/busybox busybox.tar:/root/busybox.tar","time":"2024-01-30T15:11:20+08:00"}{"level":"error","msg":"mkdir dir /root/merged error. mkdir /root/merged: file exists","time":"2024-01-30T15:11:20+08:00"}{"level":"error","msg":"mkdir dir /root/upper error. mkdir /root/upper: file exists","time":"2024-01-30T15:11:20+08:00"}{"level":"error","msg":"mkdir dir /root/work error. mkdir /root/work: file exists","time":"2024-01-30T15:11:20+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-30T15:11:20+08:00"}{"level":"info","msg":"command all is top","time":"2024-01-30T15:11:20+08:00"}
mydocker ps 查看一下:
1
2
3
root@mydocker:~/feat-rm/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
0394026801 rm1 181151 running top 2024-01-30 15:11:20
可以看到,容器正处于 running 状态。
尝试直接删除容器:
1
2
root@mydocker:~/feat-rm/mydocker# ./mydocker rm 0394026801{"level":"error","msg":"Couldn't remove running container [0394026801], Stop the container before attempting removal or force remove","time":"2024-01-30T15:12:12+08:00"}
根据错误信息可知,不能直接删除运行中的容器
于是先把容器 stop 掉:
1
2
3
4
root@mydocker:~/feat-rm/mydocker# ./mydocker stop 0394026801root@mydocker:~/feat-rm/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
0394026801 rm1 stopped top 2024-01-30 15:11:20
此时已经是 stopped 状态,可以执行删除了。
1
2
3
root@mydocker:~/feat-rm/mydocker# ./mydocker rm 0394026801root@mydocker:~/feat-rm/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
可以看到,容器信息已经不见了,说明删除成功。
强制删除 RUNNING 状态容器
再测试一下指定 -f 时能否删除 RUNNING 状态的容器。
首先,也是启动一个 detach 容器
1
2
3
4
5
6
7
8
9
root@mydocker:~/feat-rm/mydocker# ./mydocker run -d -name rm2 top
{"level":"info","msg":"createTty false","time":"2024-01-30T15:13:44+08:00"}{"level":"info","msg":"resConf:\u0026{ 0 }","time":"2024-01-30T15:13:44+08:00"}{"level":"info","msg":"busybox:/root/busybox busybox.tar:/root/busybox.tar","time":"2024-01-30T15:13:44+08:00"}{"level":"error","msg":"mkdir dir /root/merged error. mkdir /root/merged: file exists","time":"2024-01-30T15:13:44+08:00"}{"level":"error","msg":"mkdir dir /root/upper error. mkdir /root/upper: file exists","time":"2024-01-30T15:13:44+08:00"}{"level":"error","msg":"mkdir dir /root/work error. mkdir /root/work: file exists","time":"2024-01-30T15:13:44+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-30T15:13:44+08:00"}{"level":"info","msg":"command all is top","time":"2024-01-30T15:13:44+08:00"}
查看容器信息
1
2
3
4
5
root@mydocker:~/feat-rm/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
9293725578 rm2 181202 running top 2024-01-30 15:13:44
root@mydocker:~/feat-rm/mydocker# ps -ef|grep top
root 18120210 15:13 pts/10 00:00:00 top
普通删除和强制删除
1
2
3
root@mydocker:~/feat-rm/mydocker# ./mydocker rm 9293725578{"level":"error","msg":"Couldn't remove running container [9293725578], Stop the container before attempting removal or force remove","time":"2024-01-30T15:15:10+08:00"}root@mydocker:~/feat-rm/mydocker# ./mydocker rm -f 9293725578
普通删除提示失败,强制删除则成功了,看下是否真的删掉了
1
2
3
4
root@mydocker:~/feat-rm/mydocker# ./mydocker ps
ID NAME PID STATUS COMMAND CREATED
root@mydocker:~/feat-rm/mydocker# ps -ef|grep top
root 1812311776070 15:15 pts/10 00:00:00 grep --color=auto top