如果 Docker 容器正在运行,则停止并删除它

新手上路,请多包涵

如果 Docker 容器正在运行,我希望务实地停止并删除它。这是一个构建脚本。

举个例子。我将如何停止和删除 bash 脚本中 NAMES 列下的 Docker 容器“rabbitmq”?

 docker ps

CONTAINER ID        IMAGE             COMMAND                  CREATED             STATUS              PORTS                   NAMES
9909a5e2856f        rabbitmq-image   "/docker-entrypoint.s"   11 minutes ago      Up 11 minutes       0.0.0.0:5672->5672/tcp, rabbitmq
8990dd1fe503        redis-image      "/entrypoint.sh redis"   6 weeks ago         Up 4 days           0.0.0.0:32770->6379/tcp redis
etc

以下命令将删除容器并执行我想要做的事情

docker stop rabbitmq && docker rm -f rabbitmq

但是,它将它组合成我想知道的脚本?我认为它看起来像这样。

 #!/bin/bash

if [ /*docker ps check some value */ ]; then
   docker stop rabbitmq && docker rm -f rabbitmq
fi

原文由 Robbo_UK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您可能已经注意到, docker stop 以及 docker rm 如果容器不存在或未运行,则退出状态码指示失败。这会导致您的构建失败。

如果您可以处理构建日志中的错误消息,则可以执行以下小技巧来防止 shell 命令失败:

 docker stop rabbitmq || true && docker rm rabbitmq || true

在 docker 命令之一失败的情况下, true 被调用,它总是退出并显示成功的状态码。

原文由 Johannes Barop 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有一个类似的问题,但不喜欢接受的答案,因为它抑制了命令中的 所有 错误,而不仅仅是“未找到”错误。

但是, docker ps -q --filter "name=rabbitmq" 仅在该名称的容器实际存在时才产生输出,因此受到 Test if a command output an empty string 我想出的启发:

 docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

以下命令对于测试过滤器定义也很有用:

 docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found


我的实际用例是定义一对 Ansible 任务,这些任务从先前任务中生成的名称列表中删除了所有当前存在的容器(无论是否正在运行):

 - name: Check for containers that actually exist
  shell: 'docker ps -aq --filter "name={{ item }}"'
  with_items:
    - '{{ previous_command.stdout_lines }}'
  register: found_containers

- name: Remove the containers found by the above command
  shell: 'docker stop {{ item.item }} && docker rm -fv {{ item.item }}'
  with_items: '{{ found_containers.results }}'
  when: item.stdout

原文由 ncoghlan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题