我希望实际停止并删除一个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
Johannes Bar.. 125
您可能已经注意到,如果容器不存在或未运行docker stop
,则docker rm
退出时会显示状态代码,表示失败.这会导致您的构建失败.
如果您可以处理构建日志中的错误消息,您可以执行以下小技巧来防止shell命令失败:
docker stop rabbitmq || true && docker rm rabbitmq || true
在其中一个docker命令失败的情况下,true
调用它总是退出,状态代码表示成功.
您可能已经注意到,如果容器不存在或未运行docker stop
,则docker rm
退出时会显示状态代码,表示失败.这会导致您的构建失败.
如果您可以处理构建日志中的错误消息,您可以执行以下小技巧来防止shell命令失败:
docker stop rabbitmq || true && docker rm rabbitmq || true
在其中一个docker命令失败的情况下,true
调用它总是退出,状态代码表示成功.
我有一个类似的问题,但不喜欢接受的答案,因为它抑制了命令的所有错误,而不仅仅是"未找到"错误.
但是,docker ps -q --filter "name=rabbitmq"
如果实际存在该名称的容器,则仅生成输出,因此如果命令输出一个空字符串,我会想到:
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
您可以使用:
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
命令app
从BASH的变量中获取命令行var$app
NR>1
从docker ps
命令跳过第一个标题行.
$(NF) == app
比较最后一列NAMES
是否等于app变量
现在已经使用了docker一段时间了.这是我停止和删除docker容器的首选方法.
docker rm -f container_name || true