Как удалить образы докеров из концентратора докеров с помощью сценария оболочки.
Я хочу удалить все образы из частной учетной записи Docker Hub старше 50 дней.
Любые идеи? Какие инструменты использовать при создании и запуске этого сценария оболочки через терминал Jenkins или bash.
Я подумываю использовать curl для достижения своей цели.
#!/bin/bash
#Script will delete all images in all repositories of your docker hub account which are older than 'X' days
set -e
# set your username, password and no. of 'X' days value in below lines.
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"
# pass username,password and no of 'X' days value from terminal as below line.
# ./docker-images-remove-script.sh <username> <password> <30>
UNAME=$1
UPASS=$2
X=$3
# get token to be able to talk to 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
# get list of repos for that user account
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
#NOTE!!! For deleting specific repositories images please include only those repositories in for-loop, like below for-loop which has repos mysql and mymongo
#for i in mysql mymongo
for rep in ${REPO_LIST}
do
# get total no. of images & their count for a repo
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
# build a list of images from tags
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
# Get 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."
#### Note! TO delete an image please uncomment below line.
#### curl -s -X DELETE -H "Authorization: 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."
Сценарий ниже удалит все изображения во всех репозиториях вашей учетной записи Docker Hub, которые старше 50 дней.
#!/bin/bash
#Script will delete all images in all repositories of your docker hub account which are older than 50 days
set -e
# set username and password
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"
# get token to be able to talk to 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)
# get list of namespaces accessible by user (not in use right now)
#NAMESPACES=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r '.namespaces|.[]')
#echo $TOKEN
echo
# get list of repos for that user account
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
# build a list of all images & tags
for i in ${REPO_LIST}
do
# get tags for 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')
# build a list of images from tags
for j in ${IMAGE_TAGS}
do
# add each tag to list
FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
done
done
# output list of all docker images
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
# Note!!! Please un-comment below line if you wanna perform operation on all repositories of your Docker Hub account
#for i in ${REPO_LIST}
for i in randomRepo
#NOTE!!! For deleting Specific repositories images please include only those repositories in for loop like below for loop which has repos mygninx and mykibana
#for i in mynginx mykibana
do
# get tags for 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')
# build a list of images from tags
for j in ${IMAGE_TAGS}
do
echo
# add 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"
## Please uncomment below line to delete docker hub images of docker hub repositories
#curl -s -X DELETE -H "Authorization: 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"