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

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


当前回答

通过镜像名称停止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容器,停止并再次启动它

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参数,它在输出中显示图像名称或其他完整的信息

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

docker stop container-name
docker rm container-name

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

列出所有带有信息和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的映像启动的容器。

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

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

或者更短:

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