停止并删除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
获取命令行varapp
$app
-
NR>1
从docker 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)