我希望实际停止并删除一个docker容器(如果它正在运行)。这是一个构建脚本。
采用以下示例。我如何停止和删除docker container" 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
答案 0 :(得分:100)
您可能已经注意到,docker stop
以及docker rm
退出时,状态代码表示容器不存在或未运行时失败。这会导致您的构建失败。
如果您可以处理构建日志中的错误消息,您可以执行此小技巧来防止shell命令失败:
docker stop rabbitmq || true && docker rm rabbitmq || true
如果其中一个docker命令失败,则会调用true
,并始终以状态代码表示成功退出。
答案 1 :(得分:19)
我有类似的问题,但不喜欢接受的答案,因为它会抑制命令中的所有错误,而不仅仅是“未找到”错误。
但是,如果该名称的容器确实存在,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
我的实际用例是定义一对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
答案 2 :(得分:12)
您可以使用:
@Override
public List<MyObject> get(
String userName,
String searchValue,
Integer someId) {
return myService.get(userName, searchValue, someId);
}
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
命令从BASH的变量awk
获取命令行var app
$app
从NR>1
命令跳过第一个标题行。 docker ps
比较上一栏$(NF) == app
是否等于app变量答案 3 :(得分:7)
现在使用docker一段时间了。这是我停止和删除docker容器的首选方法。
docker rm -f container_name || true
答案 4 :(得分:2)
基于此处某些答案的一般形式:
docker rm -f container_name > /dev/null 2>&1 && echo 'removed container' || echo 'nothing to remove'
答案 5 :(得分:1)
# Stop the running "rabbitmq" container if there is one
CONTAINER_NAME="rabbitmq"
OLD="$(docker ps --all --quiet --filter=name="$CONTAINER_NAME")"
if [ -n "$OLD" ]; then
docker stop $OLD && docker rm $OLD
fi
答案 6 :(得分:0)
如果您需要stop
和remove
全部
#!/bin/sh
ids=$(docker ps -a -q)
for id in $ids
do
echo "$id"
docker stop $id && docker rm $id
done
答案 7 :(得分:0)
如果您不删除已停止的容器,另一种解决此问题的简单方法是依赖docker ps -a
,它将始终返回该容器ID。然后在该已停止的容器上执行docker stop
将无意义地执行任何操作:
docker stop $(docker ps -a --filter name= rabbitmq -q )
答案 8 :(得分:0)
我建议用bash来表达咒语
( docker stop $CONTAINER > /dev/null && echo Stopped container $CONTAINER && \
docker rm $CONTAINER ) 2>/dev/null || true
它始终以0退出,如果容器未在运行,则不会抱怨,如果容器实际上已停止,则显示Stopped container $CONTAINER
。
答案 9 :(得分:0)
解决这个问题的简单方法
docker container ls -al | grep <name> && docker container rm -f <name>
答案 10 :(得分:0)
在以下场景中:-
在这种情况下,您可以使用以下命令来防止构建失败。
'docker stop rabbitmq && docker rm rabbitmq || exit 0;'
答案 11 :(得分:0)
在 CI/CD 管道或不需要输出的东西中,我使用的方式是这样的:
docker rm -f rabbitmq &> /dev/null
但据我所知,&>
不是官方 POSIX 规范的一部分,所以我们应该使用:
docker rm -f rabbitmq 1> /dev/null 2>&1
-f
中的 docker rm -f
(强制):
强制移除正在运行的容器(使用 SIGKILL)
而不是 docker stop
发送:
.. SIGTERM,在一个宽限期之后,SIGKILL
1> /dev/nul
将输出 1 (stdout) 重定向到 /dev/null
,2>&1
将错误 2 (stderr) 重定向到同一个“文件”。 &
作为第一个示例重定向 1 和 2。
要编写真实文件并附加内容,请使用 docker rm -f rabbitmq 1>> docker_rabbitmq.txt 2>&1
或其他文件 docker rm -f rabbitmq 1>> docker_rabbitmq_success.txt 2>> docker_rabbitmq_error.txt
。
答案 12 :(得分:-2)
要先停止所有容器,必须使用
停止所有容器docker kill $(docker ps -q)
并删除所有容器
docker rm $(docker ps -a -q)
如果你想删除所有图像,这是命令
docker rmi $(docker images -q)