shell scripting
쉘 스크립트를 사용하여 도커 허브에서 x일보다 오래된 도커 이미지를 삭제하는 방법
쉘 스크립트를 사용하여 도커 허브에서 도커 이미지를 삭제하는 방법.
개인 도커 허브 계정의 지난 50일보다 오래된 도커 허브에서 모든 이미지를 삭제하고 싶습니다.
어떤 아이디어? Jenkins 또는 bash 터미널을 통해 이 셸 스크립트를 만들고 실행하는 동안 사용할 도구.
내 목표를 달성하기 위해 curl을 사용할 생각입니다.
아래 스크립트는 50일이 지난 도커 허브 계정의 모든 리포지토리에 있는 모든 이미지를 삭제합니다.
#!/bin/bash
#Script는 50일이 지난 docker 허브 계정의 모든 저장소에 있는 모든 이미지를 삭제합니다.
set -e
# 사용자 이름과 비밀번호 설정
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"
# Docker Hub와 통신할 수 있는 토큰을 얻습니다.
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
# 사용자가 액세스할 수 있는 네임스페이스 목록 가져오기(지금은 사용하지 않음)
#NAMESPACES=$(curl -s -H "권한 부여: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r '.namespaces|.[]')
#echo $TOKEN
echo
# 해당 사용자 계정에 대한 저장소 목록 가져오기
echo "List of Repositories in ${UNAME} Docker Hub account"
sleep 5
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/?page_size=10000 | jq -r '.results|.[]|.name')
echo $REPO_LIST
echo
# 모든 이미지 및 태그 목록을 작성합니다.
for i in ${REPO_LIST}
do
# repo에 대한 태그 가져오기
IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')
# 태그에서 이미지 목록 작성
for j in ${IMAGE_TAGS}
do
# 목록에 각 태그 추가
FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
done
done
# 모든 도커 이미지의 출력 목록
echo
echo "List of all docker images in ${UNAME} Docker Hub account"
sleep 10
for i in ${FULL_IMAGE_LIST}
do
echo ${i}
done
sleep 10
echo
echo "Identifying and deleting images which are older than 50 days in ${UNAME} docker hub account"
sleep 10
# 메모!!! Docker Hub 계정의 모든 리포지토리에서 작업을 수행하려면 아래 줄의 주석을 제거하십시오.
#for i in ${REPO_LIST}
for i in randomRepo
#노트!!! 특정 리포지토리 이미지를 삭제하려면 repos mygninx 및 mykibana가 있는 for 루프와 같이 for 루프에 해당 리포지토리만 포함하십시오.
#for i in mynginx mykibana
do
# repo에 대한 태그 가져오기
echo
echo "Looping Through $i repository in ${UNAME} account"
IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')
# 태그에서 이미지 목록 작성
for j in ${IMAGE_TAGS}
do
echo
# last_updated_time 추가
updated_time=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/${j}/?page_size=10000 | jq -r '.last_updated')
echo $updated_time
datetime=$updated_time
timeago='50 days ago'
dtSec=$(date --date "$datetime" +'%s')
taSec=$(date --date "$timeago" +'%s')
echo "INFO: dtSec=$dtSec, taSec=$taSec"
if [ $dtSec -lt $taSec ]
then
echo "This image ${UNAME}/${i}:${j} is older than 50 days, deleting this image"
## 도커 허브 리포지토리의 도커 허브 이미지를 삭제하려면 아래 줄의 주석을 제거하십시오.
#curl -s -X DELETE -H "승인: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/${j}/
else
echo "This image ${UNAME}/${i}:${j} is within 50 days time range, keep this image"
fi
done
done
echo "Script execution ends"
#!/bin/bash
#Script는 'X'일보다 오래된 도커 허브 계정의 모든 리포지토리에서 모든 이미지를 삭제합니다.
set -e
# 사용자 이름, 비밀번호 및 아니오를 설정합니다. 아래 줄의 'X'일 값.
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"
# 아래 줄과 같이 터미널에서 사용자 이름, 비밀번호 및 'X'일 값을 전달하지 않습니다.
# ./docker-images-remove-script.sh <사용자 이름> <비밀번호> <30>
UNAME=$1
UPASS=$2
X=$3
# Docker Hub와 통신할 수 있는 토큰을 얻습니다.
TOKEN=$(curl -s -H "Content-Type: application/json" -X POST -d '{"username": "'${UNAME}'", "password": "'${UPASS}'"}' https://hub.docker.com/v2/users/login/ | jq -r .token)
#echo $TOKEN
echo
# 해당 사용자 계정에 대한 저장소 목록 가져오기
echo "List of Repositories in '${UNAME}' Docker Hub account."
sleep 5
REPO_LIST=$(curl -s -H "Authorization: JWT ${TOKEN}" "https://hub.docker.com/v2/repositories/${UNAME}/?page_size=10000" | jq -r '.results|.[]|.name')
#echo "$REPO_LIST"
count=1
for rep in ${REPO_LIST}
do
echo S.No: $count RepoName: $rep
count=`expr $count + 1`
done
echo
sleep 5
echo
echo "Identifying and deleting images which are older than $X days in '${UNAME}' docker hub account."
sleep 5
#노트!!! 특정 리포지토리 이미지를 삭제하려면 repos mysql 및 mymongo가 있는 아래 for-loop과 같이 for-loop에 해당 리포지토리만 포함하십시오.
# mysql mymongo에서 나는
for rep in ${REPO_LIST}
do
# 총 번호를 얻습니다. 리포지토리에 대한 이미지 및 개수
Images=$(curl -s -H "Authorization: JWT ${TOKEN}" "https://hub.docker.com/v2/repositories/$UNAME/$rep/tags/")
ImageCount=$(echo $Images | jq -r '.count')
echo "Total no of Images in '$UNAME/$rep' repository are: $ImageCount"
pages=`expr $ImageCount / 100 + 1`
echo "No pages to iterate are: $pages"
sleep 5
for (( p=1; p<=$pages; p++ ))
do
echo "Looping Through '$rep' repository in '${UNAME}' account."
IMAGES=$(curl -s -H "Authorization: JWT ${TOKEN}" "https://hub.docker.com/v2/repositories/${UNAME}/${rep}/tags/?page_size=100&page=$p")
IMAGE_TAGS=$(echo $IMAGES | jq -r '.results|.[]|.name')
count1=1
# 태그에서 이미지 목록 작성
for tag in ${IMAGE_TAGS}
do
echo Iteration no. is: $p
echo "S.No: $count1. RepoName: '$rep' ImageTag: $tag"
count1=`expr $count1 + 1`
sleep 5
# last_updated_time 가져오기
updated_time=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${rep}/tags/${tag}/?page_size=100 | jq -r '.last_updated')
echo "Image build date and time is : $updated_time"
datetime=$updated_time
timeago=''$X' days ago'
#echo $timeago
dtSec=$(date --date "$datetime" +"%Y%m%d")
taSec=$(date --date "$timeago" +"%Y%m%d")
dt_Sec=$(date --date "$datetime" +"%Y-%m-%d")
ta_Sec=$(date --date "$timeago" +"%Y-%m-%d")
echo "INFO: Date on which this image was build: $dt_Sec"
echo "INFO: $X days earlier date from today is: $ta_Sec"
sleep 5
if [ $dtSec -lt $taSec ]
then
echo "This image '${UNAME}/${rep}:${tag}' is older than $X days, deleting this image."
#### 메모! 이미지를 삭제하려면 아래 줄의 주석을 제거하십시오.
#### curl -s -X DELETE -H "권한 부여: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${rep}/tags/${tag }/
else
echo "This image '${UNAME}/${rep}:${tag}' is within $X days time range, keeping this image."
fi
echo
done
done
echo
done
echo "Script execution ends here."