停止并删除docker集装箱,如果它的运行

我正在寻求实际上停止和删除docker集装箱,如果它正在运行。 这是一个构build脚本。

以下面的例子。 我将如何停止并删除docker容器“rabbitmq”,如在bash脚本的NAMES列中所看到的。

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 

正如你可能已经注意到, docker stop以及docker rm出口与状态代码指示失败,如果容器不存在或没有运行。 这会导致您的构build失败。

如果你可以处理你的构build日志中的错误信息,你可以做这个小窍门,以防止shell命令失败:

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

如果其中一个docker命令失败,则会调用true ,并始终以指示成功的状态码退出。

您可以使用:

 app="rabbitmq" if docker ps | awk -v app="$app" 'NR > 1 && $NF == app{ret=1; exit} END{exit !ret}'; then docker stop "$app" && docker rm -f "$app" fi 
  • awk命令从BASHvariables$app获取命令行var app $app
  • NR>1docker ps命令跳过第一个标题行。
  • $(NF) == app比较最后一列NAMES等于应用程序variables或不

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

然而, docker ps -q --filter "name=rabbitmq"只有在该名称的容器实际存在的情况下才会生成输出,所以受到Test的启发, 如果一个命令输出一个空string,我想出了:

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

以下命令对于testingfilter定义也很有用:

 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 

现在使用docker已经有一段时间了。 这是我停止和移除docker集装箱的首选方法。

 docker rm -f || true 

先停止所有的容器,你必须停止所有的容器

 docker kill $(docker ps -q) 

并删除所有容器

 docker rm $(docker ps -a -q) 

如果你想删除所有的图像这是命令

 docker rmi $(docker images -q)