在 Ubuntu 14.04 (Trusty Tahr) 上,我正在寻找一种方法来停止正在运行的容器,我拥有的唯一信息是 Docker 运行命令中使用的映像名称。
是否有命令查找与该映像名称匹配的所有匹配的运行容器并停止它们?
如果您知道 image:tag 确切的容器版本
在 issue 8959 之后,一个好的开始应该是:
docker ps -a -q --filter="name=<containerName>"
由于 name
指的是 容器 而不是图像名称,因此您需要使用 koekiebox 的 answer 中提到的较新的 Docker 1.9 filter ancestor。
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}}"))
如果您只知道图像名称(不知道图像:标签)
正如 Alex Jansen 在 the comments 中指出的:
祖先选项不支持通配符匹配。
Alex proposes a solution,但当您从同一个映像运行 多个 容器时,我设法运行的一个是(例如在您的 ~/.bashrc
中):
dsi() { docker stop $(docker ps -a | awk -v i="^$1.*" '{if($2~i){print$1}}'); }
然后我只需调用我的 bash 会话(在采购 ~/.bashrc
之后):
dsi alpine
从 alpine.*:xxx
运行的任何容器都会停止。
含义:名称以alpine
开始的任何图像。
如果您希望^$1.*
更精确,您可能需要调整awk -v i="^$1.*"
。
当然,从那里:
drmi() { docker rm $(dsi $1 | tr '\n' ' '); }
drmi alpine
将停止并删除任何 alpine:xxx
容器。
以前的答案对我不起作用,但确实如此:
docker stop $(docker ps -q --filter ancestor=<image-name> )
docker ps -q --filter ancestor=<image-name>
不返回任何内容,而接受答案中的命令 docker ps -a -q --filter ancestor=<image-name>
返回匹配的容器 ID。
my_image
)而不知道特定的图像标签(即:my_image:some_specific_tag
),则此答案也不起作用。祖先选项不支持通配符匹配。
-a
选项以删除所有容器,包括已停止的容器
您可以启动容器设置容器名称:
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>
此代码将停止所有具有图像 centos:6 的容器。我找不到更简单的解决方案。
docker ps | grep centos:6 | awk '{print $1}' | xargs docker stop
甚至更短:
docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
centos
容器,我看不到任何简单的解决方案。
停止运行容器的两种方法:
1. $docker stop container_ID
2. $docker kill container_ID
您可以使用以下命令获取正在运行的容器:
$docker ps
以下链接可获取更多信息:
https://docs.docker.com/engine/reference/commandline/stop/
https://docs.docker.com/v1.8/reference/commandline/kill/
$docker
吗?还是来自 shell 提示符的 $
?
按图像名称停止 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}')
如果您创建了映像,则可以向其添加 label 并按标签过滤正在运行的容器
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}'
是有问题的,因为图像名称可能会出现在其他图像的其他列中
我制作了一个 /usr/local/bin/docker.stop
来接收图像名称(假设您只有一个正在运行)。
docker stop $(docker ps -q -f "name=$1")
列出所有包含信息和 ID 的容器
docker ps
docker stop CONTAINER ID
对于 Docker 版本 18.09.0,我发现不需要格式标志
docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
我试图将我的 Docker 命令包装在 gulp 任务中,并意识到您可以执行以下操作:
docker stop container-name
docker rm container-name
这可能不适用于您有多个同名容器的场景(如果可能的话),但对于我的用例来说它是完美的。
在我的情况下,--filter ancestor=<image-name>
不起作用,因此以下命令为我清理了 Docker 容器:
docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))
在@VonC 极好的答案之上添加,这是一个 ZSH 函数,您可以将其添加到您的 .zshrc 文件中:
dockstop() {
docker rm $(docker stop $(docker ps -a -q --filter ancestor="$1" --format="{{.ID}}"))
}
然后在您的命令行中,只需执行 dockstop myImageName
,它将停止并删除从名为 myImageName 的映像启动的所有容器。
使用:docker container stop $(docker container ls -q --filter original=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$
这是我重建 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 参数,它在输出中全长显示图像名称或其他信息
这是一个简洁的命令,不需要您指定图像标签(就像大多数答案一样):
docker stop $(docker ps -a | awk -v i="^${image_name}.*" '{if($2~i){print$1}}')
docker stop "$(...)"
中的那些双引号吗?每当我尝试您的选择时,我都会得到:Error response from daemon: No such container: 804d82eebf40 36adf6b2be3d d288a5f934dd
。但是,如果没有双引号,它确实有效。
tr
调用。你还记得需要它的具体情况吗?
docker run -d alpine:3.10.3 tail -f /dev/null
。然后我试图一口气阻止他们。
print $1
而不是 print$1
:使用 print$1
,不需要 tr
。再次感谢你。我会修正我的答案。
docker stop $(docker ps -a | grep "zalenium")
docker rm $(docker ps -a | grep "zalenium")
这应该足够了。
如果您想更喜欢简单的 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 标签,因为它是一个相等的比较器。
如果您知道容器名称的一部分,则可以将 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
这只会停止所有带有 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))
您可以使用 ps
命令查看正在运行的容器:
docker ps -a
从那里您应该会看到您的容器名称以及您要查找的容器 ID。 Here's more information about docker ps
。
ps -a
返回。 已移除 容器...好吧,它们已被移除,它们不再存在。