[Docker] 똑같은 여러개의 컨테이너들을 시간순으로 삭제하기

youngseoKim·2020년 2월 27일
0

Hyperledger Application 개발 도중 다음과 같은 이슈를 만났다.

Hyperledger 노드에 여러가지 cli 명령어를 주기위해
hyperledger/fabric-tools 이미지를 이용해 컨테이너를 만드는데,
사용중인 에이전트 프로그램에서 이 tools 컨테이너가 여러개 생성되는 이슈가 있었고,
Application을 개발하면서 자주보는 이슈였다.
그래서 항상 하나하나 지워줘야 했는데.
여기서 모든 컨테이너를 지우는게 아니라,
가장 최근에 생성된 컨테이너를 제외하고 지워야 했다.
어느날 똑같은 20~30개의 컨테이너가 올라오고, 하나하나 지우긴 너무 힘들 것 같아
쉘 스크립트를 작성했다.
쨌던 이게 중요한게 아니고, !

상황

  • 컨테이너의 이미지가 동일하다.
  • 컨테이너의 이름은 같은 prefix로 시작한다.
  • 가장 최근에 생성된 컨테이너는 지우지 말아야한다.
  • 위와 같은 규칙을 가진 동일된 컨테이너가 여러개 떠있다.

알고리즘

(1) tools 이름을 가진 모든 컨테이너의 ID를 조회
(2) (1)의 조회된 리스트에 시간순으로 정렬
(3) (2)의 리스트는 오래전에 올라온 컨테이너가 앞에있고, 최근으로 갈수록 뒤에 있을 것 이다.
(4) 반복문을 돌면서 맨 마지막 컨테이너의 ID를 제외하고 삭제!

코드작성

1. 리스트 구하기

array=( $(docker ps -qf name=tools | tac) )
  • docker ps -> 컨테이너 목록 조회
  • -q -> ID만 조회
  • -f -> name으로 검색
  • tac -> 시간순 정렬

2. 리스트 길이 구하기

arrayLength=${#array[@]}

3. 반복문

for((i=0; i< $arrayLength; i++)); do
        echo "rm container : " + ${array[i]}
        docker rm -f ${array[i]}
done

4. 반복문에 조건 추가

마지막 컨테이너 제외하는 조건 추가.

        if [ $i -eq `expr $arrayLength - 1` ];then
                exit 0
        fi
  • expr -> 정수연산 명령
  • 마지막 반복일때 exit 0 코드 반환

전체 코드

#!/bin/bash

array=( $(docker ps -qf name=tools | tac) )

arrayLength=${#array[@]}
echo "tools length : $arrayLength"

for((i=0; i< $arrayLength; i++)); do
        if [ $i -eq `expr $arrayLength - 1` ];then
                exit 0
        fi
        echo "rm container : " + ${array[i]}
        docker rm -f ${array[i]}
done

마무리

도커 명령어를 잘 몰라

array=( $(docker ps -qf name=tools | tac) )

이런식으로 리스트를 불러왔지만..
더 효율적인 방법이 분명히 많이 있을 것 같다.

알려주시면 감사하겠습니다 ㅎㅎ

profile
현재 마크애니 블록체인팀에서 블록체인 솔루션과 DAPP 파트를 개발하고 있습니다. 서버 개발과 운영 , 클라우드 서비스에 관심이 많습니다.

0개의 댓글