Назад | Перейти на главную страницу

Скрипт оболочки для докера ps -a | grep, чтобы найти количество определенных запущенных контейнеров

Я хочу написать сценарий, который выполняется моим сервером сборки разработки, который удалит все «похожие» контейнеры докеров перед сборкой и запуском нового контейнера.

Ниже приведен псевдокод необходимого мне сценария bash.

var name = $1
var number_of_results = # of containers returned from $(docker ps -a | grep "$name")

if(number_of_result > 0)
      docker rm -f $(docker ps -a | grep "$name")

Следующий сценарий должен делать то, что вы хотите:

#!/bin/bash

name=$1

matchingStarted=$(docker ps --filter="name=$name" -q | xargs)
[[ -n $matchingStarted ]] && docker stop $matchingStarted

matching=$(docker ps -a --filter="name=$name" -q | xargs)
[[ -n $matching ]] && docker rm $matching

По сути, он проверяет, есть ли запущенный контейнер с указанным именем, и останавливает его, если находит его. Затем он удаляет любой контейнер с указанным именем.

Заметка: Вы можете добавить некоторую проверку аргумента, как если бы этот сценарий использовался без аргумента, он остановит все запущенные контейнеры и удалит все остановленные контейнеры. Я не добавил его сюда, чтобы он был простым и читабельным.

Вы должны принять во внимание как минимум два случая: удаление остановленного контейнера, который можно удалить с помощью одной команды, и удаление запущенных контейнеров, при котором контейнер должен быть остановлен перед удалением.

В дополнение к этому, вместо использования grep чтобы найти имя контейнера, я бы использовал filter вариант docker ps, таким образом вы не попадете в неправильный контейнер только потому, что, скажем, параметр команды совпадает с именем, которое вы поместили в grep. Вот как я бы удалил любые похожие контейнеры докеров, строго следуя приведенной ниже последовательности:

  1. Удалить запущенные контейнеры
for container_id in $(docker ps  --filter="name=$name" -q);do docker stop $container_id && docker rm $container_id;done
  1. Удалите остановленные контейнеры, так как мы остановили запуск контейнеров на шаге 1.
for container_id in $(docker ps  --filter="name=$name" -q -a);do docker rm $container_id;done

В -a опция будет включать все контейнеры, в том числе остановленные. Не используя -a, опция по умолчанию, будет включать только работающие контейнеры. Итак, на первом шаге вы удаляете работающие контейнеры, а затем на втором шаге переходите к остановленным. Чтобы удалить или остановить контейнер, все, что вам нужно, это идентификатор контейнера, -q options выводит только ID.