【问题标题】:Stopping Docker containers by image name - Ubuntu按映像名称停止 Docker 容器 - Ubuntu
【发布时间】:2015-11-11 11:34:20
【问题描述】:

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

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

【问题讨论】:

    标签: docker ubuntu docker-image


    【解决方案1】:

    如果您知道 image:tag 的确切容器版本

    跟随issue 8959,一个好的开始应该是:

    docker ps -a -q --filter="name=<containerName>"
    

    由于name 指的是容器 而不是图像名称,因此您需要使用更新的Docker 1.9 filter ancestor,在koekieboxanswer 中提到。

    docker ps -a -q  --filter ancestor=<image-name>
    

    正如下面kiril 评论的那样,删除这些容器:

    stop 也返回容器。

    所以链接 stoprm 就可以了:

    docker rm $(docker stop $(docker ps -a -q --filter ancestor=<image-name> --format="{{.ID}}"))
    

    如果您只知道图片名称(不知道image:tag

    正如Alex Jansenthe comments 中指出的那样:

    ancestor option 不支持通配符匹配。

    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 pd 不会返回它们。有什么线索可以做吗?
    • @kiril 停止的容器由ps -a 返回。 已移除 容器...好吧,它们已被移除,它们不再存在。
    • 谢谢,我没有意识到 stop 也会返回容器。所以链接 stop 和 rm 将完成这项工作: docker rm $(docker stop $(docker ps -a -q --filter="name="))
    • @kiril 就是这个想法,是的。
    • @AlexJansen 有趣的反馈,谢谢。当我从同一个图像运行多个容器时,我没有设法使您的解决方案工作,因此我在回答中引用了您的解决方案,并根据您的添加了我自己的实现。再次感谢您。
    【解决方案2】:

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

    docker ps -a
    

    从那里您应该会看到容器的名称以及您要查找的容器 ID。 Here's more information about docker ps.

    【讨论】:

    • 链接已损坏(抱歉,我们找不到该页面)。
    【解决方案3】:

    我创建了一个/usr/local/bin/docker.stop 来接收图像名称(假设您只有一个正在运行)。

    docker stop $(docker ps -q -f "name=$1")
    

    【讨论】:

      【解决方案4】:

      以前的答案对我不起作用,但确实如此:

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

      【讨论】:

      • 也适用于 Windows 的 Docker 终端。
      • 这在 Ubuntu 20.04 和 Docker 版本 20.10.5,构建 55c4c88 中对我不起作用。命令docker ps -q --filter ancestor=&lt;image-name&gt; 不返回任何内容,而接受答案中的命令docker ps -a -q --filter ancestor=&lt;image-name&gt; 返回匹配的容器ID。
      • 如果您只知道存储库(即:my_image)而不知道特定的图像标签(即:my_image:some_specific_tag),此答案也不起作用。祖先选项不支持通配符匹配。
      【解决方案5】:

      我试图将我的 Docker 命令包装在 gulp 任务中,并意识到您可以执行以下操作:

      docker stop container-name
      docker rm container-name
      

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

      【讨论】:

        【解决方案6】:

        您可以启动容器设置容器名称:

        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 &lt;img-name&gt; &amp;&amp; sudo docker stop &lt;container-name&gt; || true &amp;&amp; sudo docker run -d --rm --name &lt;container-name&gt; &lt;img-name&gt;
        【解决方案7】:

        此代码将停止 所有 带有图像 centos:6 的容器。我找不到更简单的解决方案。

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

        甚至更短:

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

        【讨论】:

        • 需要改进 :::: docker stop $(docker ps -a | grep centos:6 | awk '{print $1}')
        • @Shaileshkumar 添加了您的版本 =)
        • 同样,这需要知道标签。例如,如果您想停止任何版本的所有 centos 容器,我看不到任何简单的解决方案。
        【解决方案8】:

        停止运行容器的两种方法:

        1. $docker stop container_ID
        
        2. $docker kill container_ID
        

        您可以使用以下命令获取正在运行的容器:

        $docker ps
        

        以下链接了解更多信息:

        【讨论】:

        • 最后一个链接坏了(“抱歉,我们找不到那个页面”)。
        • 真的是$docker吗?还是来自 shell 提示符的 $
        【解决方案9】:

        在我的情况下,--filter ancestor=&lt;image-name&gt; 不起作用,因此以下命令为我清理了 Docker 容器:

        docker rm $(docker stop $(docker ps -a -q --filter "name=container_name_here" --format="{{.ID}}"))
        

        【讨论】:

          【解决方案10】:

          对于 Docker 版本 18.09.0 我发现不需要格式标志

          docker rm $(docker stop $(docker ps -a -q -f ancestor=<image-name>))
          

          【讨论】:

            【解决方案11】:
            docker stop $(docker ps -a | grep "zalenium")
            docker rm $(docker ps -a | grep "zalenium")
            

            这应该足够了。

            【讨论】:

              【解决方案12】:

              按镜像名称停止 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>
              

              does not always work

              docker ps -a -q --filter="name=<containerName>"
              

              按容器名称过滤,而不是图像名称

              docker ps | grep <image-name> | awk '{print $1}'
              

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

              【讨论】:

              • 这是这里的第一个答案,它实际上支持基于图像名称停止容器。其他答案也需要您知道图像标签。
              【解决方案13】:

              列出所有包含信息和 ID 的容器

              docker ps
              
              docker stop CONTAINER ID
              

              【讨论】:

                【解决方案14】:

                在@VonC 极好的答案之上添加,这是一个 ZSH 函数,您可以将其添加到您的 .zshrc 文件中:

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

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

                【讨论】:

                  【解决方案15】:

                  使用: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$
                  

                  【讨论】:

                    【解决方案16】:

                    如果您想更喜欢简单的 AWK 方法,我的做法是:

                    docker rm -f $(docker ps | awk '{ if($2 == "<your image name>") { print $NF}}')
                    

                    $(docker ps | awk '{ if($2 == "&lt;your image name&gt;") { print $NF}}') - 根据输入图像打印 docker 容器名称

                    docker ps - 列出所有容器

                    awk '{ if($2 == "&lt;your-image-name&gt;") { 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 标签,因为它是一个相等的比较器。

                    【讨论】:

                      【解决方案17】:

                      这是我重建 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 参数,它在输出中全长​​显示图像名称或其他信息

                      【讨论】:

                        【解决方案18】:

                        这是一个简洁的命令,不需要您指定图像标签(大多数答案都是这样做的):

                        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。再次感谢你。我会修正我的答案。
                        【解决方案19】:

                        如果您知道容器名称的一部分,则可以将 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
                        

                        【讨论】:

                          猜你喜欢
                          • 2017-12-20
                          • 2016-09-08
                          • 2019-11-21
                          • 1970-01-01
                          • 2018-11-03
                          • 2023-03-18
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多