Я хочу записать сценарий, который выполняется моим сервером сборки разработки, который удалит любые 'подобные' контейнеры докера прежде, чем создать и выполнить новый контейнер.
Ниже псевдо код для сценария удара, в котором я нуждаюсь
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")
Вы должны принять во внимание как минимум два случая: удаление остановленного контейнера, который может быть удален с помощью одной команды, и удаление запущенных контейнеров, при котором контейнер должен быть остановлен перед удалением.
В дополнение к этому, вместо использования grep
для поиска имени контейнера, я бы использовал параметр filter
в docker ps
, чтобы вы не приведет к тому, что grep будет использовать неправильный контейнер только потому, что, скажем, параметр команды соответствует имени, которое вы поместили в 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
выводят только идентификатор.
Следующий скрипт должен делать то, что вы хотите:
#!/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
По сути, он проверяет, есть ли запущенный контейнер с предоставленное имя и остановите его, если оно найдет. Затем он удаляет любой контейнер с указанным именем.
Примечание : вы можете добавить некоторую проверку аргумента, так как при использовании без аргумента этот сценарий остановит все запущенные контейнеры и удалит все остановленные контейнеры. Я не добавил его сюда, чтобы он был простым и читабельным.