按映像名称停止Docker容器-Ubuntu


155

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

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

Answers:


210

发行8959之后,一个良好的开端将是:

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

由于name是指容器而不是映像名称,因此您需要使用koekiebox答案中提到的最新的Docker 1.9过滤器祖先

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

如下面kiril所述,删除那些容器:

stop 还返回容器。

因此链接stoprm会完成这项工作:

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

这很棒。此后我的问题是,删除容器时,由于容器已停顿,因此docker pd不会返回它们。关于如何做的任何线索?
kiril 2015年

@kiril停止的容器由返回ps -a已删除的容器...好了,它们也被删除了,它们已经不存在了。
VonC 2015年

1
谢谢,我没有意识到stop也可以返回容器。因此,链接stop和rm可以完成工作:docker rm $(docker stop $(docker ps -a -q --filter =“ name = <imageName>”))
kiril 2015年

@kiril就是这样,是的。
VonC 2015年


44

您可以通过设置容器名称来启动容器:

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

可以使用同一映像启动多个容器,因此这是启动容器的好方法。然后,您可以使用此容器名称停止,附加...容器:

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

我真的很喜欢这个解决方案。有没有比这更好的方法来构建,停止/删除然后运行容器了?sudo docker build . -t <img-name> && sudo docker stop <container-name> || true && sudo docker run -d --rm --name <container-name> <img-name>
melanke

16

此代码将停止所有带有图像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 $(docker ps -a | grep centos:6 | awk'{print $ 1}')
Shailesh kumar

@Shaileshkumar添加了您的版本=)
ArgonQQ '17

9

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

1. $docker stop container_ID

2. $docker kill container_ID

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

$docker ps

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


最后一个链接已断开(“抱歉,我们找不到该页面”)。
彼得·莫滕森

是字面上的$docker吗?还是$从shell提示?
彼得·莫滕森

2

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

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

2

按映像名称停止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}'

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


1

我制作了一个/usr/local/bin/docker.stop使用映像名称的文件(假设您只运行了一个)。

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

1

我试图将Docker命令包装在gulp任务中,并意识到可以执行以下操作:

docker stop container-name
docker rm container-name

对于您有多个具有相同名称的容器(如果可能)的情况,这可能不起作用,但是对于我的用例来说,它是完美的。


1

就我而言--filter ancestor=<image-name>,它不起作用,因此以下命令为我清理了Docker容器:

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


1

除了@VonC最佳答案之外,还有以下ZSH函数,您可以将其添加到.zshrc文件中:

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

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


0
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")

这应该足够了。


0

使用:docker容器停止$(docker容器ls -q --filter ancestor = 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$

0

如果您想使用简单的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中包含image标签,因为它是一个比较器。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.