Я хочу написать сценарий, который выполняется моим сервером сборки разработки, который удалит все «похожие» контейнеры докеров перед сборкой и запуском нового контейнера.
Ниже приведен псевдокод необходимого мне сценария 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. Вот как я бы удалил любые похожие контейнеры докеров, строго следуя приведенной ниже последовательности:
for container_id in $(docker ps --filter="name=$name" -q);do docker stop $container_id && docker rm $container_id;done
for container_id in $(docker ps --filter="name=$name" -q -a);do docker rm $container_id;done
В -a
опция будет включать все контейнеры, в том числе остановленные. Не используя -a
, опция по умолчанию, будет включать только работающие контейнеры. Итак, на первом шаге вы удаляете работающие контейнеры, а затем на втором шаге переходите к остановленным. Чтобы удалить или остановить контейнер, все, что вам нужно, это идентификатор контейнера, -q
options выводит только ID.