在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))

其他回答

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

docker ps

docker stop CONTAINER ID

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

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

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

docker ps -a

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

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 run -d --name <container-name> <image-name>

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

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