在Ubuntu 14.04 (Trusty Tahr)上,我正在寻找一种停止运行容器的方法,我所拥有的唯一信息是Docker run命令中使用的映像名称。
是否有一个命令来查找与映像名称匹配的所有正在运行的匹配容器并停止它们?
在Ubuntu 14.04 (Trusty Tahr)上,我正在寻找一种停止运行容器的方法,我所拥有的唯一信息是Docker run命令中使用的映像名称。
是否有一个命令来查找与映像名称匹配的所有正在运行的匹配容器并停止它们?
当前回答
适用于Docker 18.09.0版本 我发现不需要格式标志
docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
其他回答
如果你想要一个简单的AWK方法,这是我的看法:
docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')
$(docker ps | awk '{if($2 == "<您的映像名称>"){print $NF}}') -根据输入的映像打印docker容器名称
列出所有的容器
awk '{if($2 == "<you -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: 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容器,停止并再次启动它
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参数,它在输出中显示图像名称或其他完整的信息
这只会停止所有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))
如果你知道容器名称的一部分,你可以使用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