Сценарий оболочки для PS докера-a | grep для нахождения количества определенного выполнения контейнеров

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

Ниже псевдо код для сценария удара, в котором я нуждаюсь

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")
6
задан 8 July 2015 в 18:20
2 ответа

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

В дополнение к этому, вместо использования grep для поиска имени контейнера, я бы использовал параметр filter в docker ps , чтобы вы не приведет к тому, что grep будет использовать неправильный контейнер только потому, что, скажем, параметр команды соответствует имени, которое вы поместили в 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 выводят только идентификатор.

2
ответ дан 3 December 2019 в 00:35

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

#!/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

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

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

2
ответ дан 3 December 2019 в 00:35

Теги

Похожие вопросы