在Ubuntu 14.04 (Trusty Tahr)上,我正在寻找一种停止运行容器的方法,我所拥有的唯一信息是Docker run命令中使用的映像名称。
是否有一个命令来查找与映像名称匹配的所有正在运行的匹配容器并停止它们?
在Ubuntu 14.04 (Trusty Tahr)上,我正在寻找一种停止运行容器的方法,我所拥有的唯一信息是Docker run命令中使用的映像名称。
是否有一个命令来查找与映像名称匹配的所有正在运行的匹配容器并停止它们?
当前回答
这只会停止所有image = "yourImgName"的容器:
sudo docker stop $(sudo docker ps | grep "yourImgName" | cut -d " " -f 1)
这将停止并删除所有image = "yourImgName"的容器:
sudo docker rm $(sudo docker stop $(sudo docker ps -a | grep "yourImgName" | cut -d " " -f 1))
其他回答
如果你知道图像:标记准确的容器版本
以下是第8959期,一个好的开始是:
docker ps -a -q --filter="name=<containerName>"
因为name指的是容器而不是镜像名称,你需要使用最新的Docker 1.9过滤器祖先,在koekiebox的回答中提到过。
docker ps -a -q --filter ancestor=<image-name>
正如下面kiril所评论的,要移除这些容器:
Stop也返回容器。
因此,链接stop和rm将完成工作:
docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))
如果你只知道图像名称(不知道image:tag)
Alex Jansen在评论中指出:
祖先选项不支持通配符匹配。
Alex提出了一个解决方案,但我设法运行的解决方案是,当您从同一个映像运行多个容器时(在您的~/。例如Bashrc):
dsi() { docker stop $(docker ps -a | awk -v i="^$1.*" '{if($2~i){print$1}}'); }
然后我只是调用我的bash会话(在来源~/.bashrc之后):
dsi alpine
还有所有从阿尔卑斯出发的集装箱。*:xxx会停止。
含义:任何名称以alpine开头的图像。 你可能需要调整awk -v i="^$1。如果你想要^$1。更准确地说。
当然,从那里开始:
drmi() { docker rm $(dsi $1 | tr '\n' ' '); }
drmi alpine会停止并删除任何alpine:xxx容器。
image: docker
services:
- docker:dind
stages:
- deploy
step-deploy-prod:
stage: deploy
tags:
- docker
script:
- container_id=$(docker ps -q -a -f status=running --filter name=todoapp)
- if [ -n "$container_id" ]; then
docker stop $container_id;
docker rm -f $container_id;
fi
- container_id=$(docker ps -q -a -f status=exited --filter name=todoapp)
- if [ -n "$container_id" ]; then
docker rm -f $container_id;
fi
- docker build -t app/creative .
- docker run -d -p 8081:80 --name todoapp app/creative
首先,使用docker ps -q -a -f status=running——filter name=todoapp命令来检查一个正在运行的容器,如果它找到一个,它就会停止并删除正在运行的容器,然后使用docker ps -q -a -f status=exited——filter name=todoapp命令来检查任何被停止并具有todoapp名称的容器,如果它找到了,它就会删除这个容器。 然后它将构建一个新映像,并使用新的构建映像启动一个新容器。
正如我所发现的,如果你想要通过gitlab-ci替换一个新部署的镜像,如果你停止容器,它就不能用docker rm找到,以防有人偶然发现这个
在docker ps命令-f status=exit中有一个选项,显示所有处于停止状态的容器。
container_id=$(docker ps -q -a -f status=exited --filter name=todoapp)
该命令只返回已停止且名称为todoapp的容器id
另外,删除停止容器的更好方法是在docker rm命令下使用-f或——force选项。此选项将删除容器,即使它处于停止状态。
这段代码将停止所有图像为centos:6的容器。我找不到更简单的解决办法了。
docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop
或者更短:
docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
你可以使用ps命令查看正在运行的容器:
docker ps -a
从那里,您应该可以看到容器的名称以及您正在寻找的容器ID。这里有更多关于docker ps的信息。
我创建了一个/usr/local/bin/docker。接收映像名称的Stop(假设只有一个正在运行)。
docker stop $(docker ps -q -f "name=$1")