首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止并删除正在运行的Docker容器

停止并删除正在运行的Docker容器
EN

Stack Overflow用户
提问于 2015-12-11 17:08:50
回答 15查看 113.5K关注 0票数 142

如果Docker容器正在运行,我将以务实的方式停止并删除它。这是一个构建脚本。

以下面的例子为例。如何停止并删除bash脚本中的NAMES列中的Docker容器"rabbitmq“?

代码语言:javascript
复制
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 

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

代码语言:javascript
复制
docker stop rabbitmq && docker rm -f rabbitmq

但是,它正在把它整理成一个我想知道的脚本?我想应该是这样的。

代码语言:javascript
复制
#!/bin/bash

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

回答 15

Stack Overflow用户

回答已采纳

发布于 2016-07-06 13:31:07

正如您可能已经注意到的,如果容器不存在或不运行,docker stopdocker rm退出时都会使用状态代码表示失败。这会导致构建失败。

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

代码语言:javascript
复制
docker stop rabbitmq || true && docker rm rabbitmq || true

如果其中一个docker命令失败,则调用true,它总是以状态代码表示成功而退出。

票数 272
EN

Stack Overflow用户

发布于 2017-06-05 07:57:53

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

但是,docker ps -q --filter "name=rabbitmq"只在该名称的容器确实存在时才生成输出,因此,受Test if a command outputs an empty string的启发,我想出了如下方法:

代码语言:javascript
复制
docker ps -q --filter "name=rabbitmq" | grep -q . && docker stop rabbitmq && docker rm -fv rabbitmq

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

代码语言:javascript
复制
docker ps -q --filter "name=rabbitmq" | grep -q . && echo Found || echo Not Found

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

代码语言:javascript
复制
- 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
票数 67
EN

Stack Overflow用户

发布于 2017-07-22 10:51:22

这是我喜欢的方式,以停止和移除一个码头集装箱。真的管道在那里,以确保它总是输出一个成功。没有它,如果容器名不存在,任何bash脚本都会退出和出错。

代码语言:javascript
复制
docker rm -f container_name || true
票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34228864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档