如果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发布于 2016-07-06 13:31:07
正如您可能已经注意到的,如果容器不存在或不运行,docker stop和docker rm退出时都会使用状态代码表示失败。这会导致构建失败。
如果您能够处理构建日志中的错误消息,就可以执行这个小技巧来防止shell命令失败:
docker stop rabbitmq || true && docker rm rabbitmq || true如果其中一个docker命令失败,则调用true,它总是以状态代码表示成功而退出。
发布于 2017-06-05 07:57:53
我也有类似的问题,但我不喜欢被接受的答案,因为它抑制了命令中的所有错误,而不仅仅是“找不到”错误。
但是,docker ps -q --filter "name=rabbitmq"只在该名称的容器确实存在时才生成输出,因此,受Test if a command outputs 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我的实际用例是定义一对不可用任务,从以前的任务中生成的名称列表中删除所有当前存在的容器(无论是否正在运行):
- 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发布于 2017-07-22 10:51:22
这是我喜欢的方式,以停止和移除一个码头集装箱。真的管道在那里,以确保它总是输出一个成功。没有它,如果容器名不存在,任何bash脚本都会退出和出错。
docker rm -f container_name || truehttps://stackoverflow.com/questions/34228864
复制相似问题