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

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


当前回答

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

docker ps -a

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

其他回答

如果你知道图像:标记准确的容器版本

以下是第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容器。

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

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

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

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选项。此选项将删除容器,即使它处于停止状态。

通过镜像名称停止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}'

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

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

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

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

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