通过映像名称停止Docker容器- Ubuntu

在ubuntu 14.04 (Trusty Tahr)上,我正在寻找一种停止正在运行的容器的方法,我唯一拥有的信息是Docker run命令中使用的镜像名称。

是否有一个命令来查找与映像名称匹配的所有正在运行的匹配容器并停止它们?

198694 次浏览

如果你知道image:tag容器的确切版本

按照发行8959,一个好的开始是:

docker ps -a -q --filter="name=<containerName>"

因为name指的是容器而不是图像名称,所以你需要使用最近的Docker 1.9过滤器祖先,在koekiebox回答中提到过。

docker ps -a -q  --filter ancestor=<image-name>

如下面所述,要移除这些容器:

stop也返回容器。

因此,将stoprm链接起来将完成这项工作:

docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="\{\{.ID}}"))

如果你只知道图像名称(而不是image:tag)

正如亚历克斯·詹森的评论中指出的:

祖先的选择不支持通配符匹配。

Alex 提出解决方案,但我设法运行,当你有多个容器从同一映像运行是(在你的~/.bashrc为例):

dsi() { docker stop $(docker ps -a | awk -v i="^$1.*" '{if($2~i){print$1}}'); }

然后我只是调用我的bash会话(在源~/.bashrc之后):

dsi alpine

并且任何从alpine.*:xxx运行的容器都将停止。

含义:任何名称为开始alpine的图像。
如果你想让^$1.*更精确,你可能需要调整awk -v i="^$1.*"

当然,从那里开始:

drmi() { docker rm $(dsi $1  | tr '\n' ' '); }

drmi alpine将停止和删除任何alpine:xxx容器。

你可以使用ps命令查看正在运行的容器:

docker ps -a

从那里,您应该可以看到容器的名称以及您正在寻找的容器ID。下面是关于docker ps的更多信息

我做了一个/usr/local/bin/docker.stop,它接受图像名称(假设你只有一个正在运行)。

docker stop $(docker ps -q -f "name=$1")

之前的答案对我来说没用,但这个对我有用:

docker stop $(docker ps -q --filter ancestor=<image-name> )

我试图在gulp任务中包装我的Docker命令,并意识到你可以做以下事情:

docker stop container-name
docker rm container-name

这可能不适用于具有相同名称的多个容器的场景(如果可能的话),但对于我的用例来说,这是完美的。

你可以设置一个容器名来启动容器:

docker run -d --name <container-name> <image-name>

同一个映像可以用来启动多个容器,因此这是启动容器的好方法。然后你可以使用这个container-name来停止,附加…容器:

docker exec -it <container-name> bash
docker stop <container-name>
docker rm <container-name>

这段代码将停止映像为centos: 6所有容器。我找不到更简单的解决办法了。

docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop

或者更短:

docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')

停止运行容器的两种方法:

1. $docker stop container_ID


2. $docker kill container_ID

您可以使用以下命令获取正在运行的容器:

$docker ps

以下链接可获取更多信息:

在我的情况下,--filter ancestor=<image-name>不工作,所以下面的命令为我清理Docker容器:

docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="\{\{.ID}}"))

对于Docker版本18.09.0 我发现格式标志将不需要

docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

这应该足够了。

通过镜像名称停止docker容器:

imagename='mydockerimage'
docker stop $(docker ps | awk '{split($2,image,":"); print $1, image[1]}' | awk -v image=$imagename '$2 == image {print $1}')

通过镜像名称和标签停止docker容器:

imagename='mydockerimage:latest'
docker stop $(docker ps | awk -v image=$imagename '$2 == image {print $1}')

如果你创建了映像,你可以在映像中添加标签并通过标签过滤正在运行的容器

docker ps -q --filter "label=image=$image"

不可靠的方法

docker ps -a -q  --filter ancestor=<image-name>

并不总是有效

docker ps -a -q --filter="name=<containerName>"

根据容器名称筛选,而不是映像名称

docker ps | grep <image-name> | awk '{print $1}'

是否有问题,因为图像名称可能出现在其他图像的其他列中

列出所有带有信息和ID的容器

docker ps


docker stop CONTAINER ID

在@VonC精彩的回答之上,这里有一个ZSH函数,你可以添加到你的。zshrc文件中:

dockstop() {
docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="\{\{.ID}}"))
}

然后在命令行中,简单地执行dockstop myImageName,它将停止并删除所有从名为myImageName的映像启动的容器。

用途:Docker容器stop $(Docker容器ls -q——filter祖宗=mongo)

    (base) :~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
d394144acf3a        mongo               "docker-entrypoint.s…"   15 seconds ago      Up 14 seconds       0.0.0.0:27017->27017/tcp   magical_nobel
(base) :~ user$ docker container stop $(docker container ls -q --filter ancestor=mongo)
d394144acf3a
(base) :~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
(base) :~ user$

如果你想更喜欢一个简单的AWK方法,这是我的看法:

docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')

$(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}') -根据输入图像打印docker容器名称

docker ps列出所有容器

awk '{ if($2 == "<your-image-name>") { print $NF}}' - docker ps的第二列给出了映像名称。将其与图像名称进行比较将执行print $NF,打印容器名称。

docker rm -f删除容器

例如,删除所有运行中的ubuntu镜像容器,可以简单地这样做:

docker rm -f $(docker ps | awk '{ if($2 == "ubuntu:latest") { print $NF}}')

PS:记得在AWK中包含图像标记,因为它是一个相等的比较器。

这是我的脚本重新构建docker容器,停止并再次启动它

docker pull [registry]/[image]:latest
docker build --no-cache -t [localregistry]/[localimagename]:latest -f compose.yaml context/
docker ps --no-trunc | grep [localimagename] | awk '{print $1}' | xargs docker stop
docker run -d -p 8111:80 [localregistry]/[localimagename]:latest

注意——no-trunc参数,它在输出中显示图像名称或其他完整的信息

下面是一个简洁的命令,它不需要你指定图像标签(大多数答案都需要):

docker stop $(docker ps -a | awk -v i="^${image_name}.*" '{if($2~i){print$1}}')

如果你知道容器名称的一部分,你可以使用AWK与docker如下:

  CONTAINER_IDS=$(docker ps -a | awk '($2 ~ /container.*/) {print $1}')
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
echo "No containers available for deletion"
else
docker rm -f $CONTAINER_IDS
fi

这将只有停止所有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))