如果它正在运行,则停止并删除docker容器

时间:2015-12-11 17:08:50

标签: bash docker containers

我希望实际停止并删除一个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

13 个答案:

答案 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
  • $appNR>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)

如果您需要stopremove全部

,请在script.sh中复制此代码
#!/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)

在以下场景中:-

  1. Windows 上的 Docker(wsl2)
  2. Jenkins 服务器在同一窗口上。
  3. 使用 Jenkins 管道构建和运行容器。
  4. 在管道中使用 bat 脚本。

在这种情况下,您可以使用以下命令来防止构建失败。

'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/null2>&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)
相关问题