shell scripting
Come eliminare le immagini docker più vecchie di x giorni da docker hub usando uno script di shell
Come eliminare le immagini docker da docker hub utilizzando uno script di shell.
Voglio eliminare tutte le immagini da docker hub più vecchie degli ultimi 50 giorni di un account docker hub privato.
Qualche idea? Quali strumenti utilizzare durante la creazione e l'esecuzione di questo script di shell da Jenkins o dal terminale bash.
Sto pensando di utilizzare il curl per raggiungere il mio obiettivo.
Lo script seguente cancellerà tutte le immagini presenti in tutti i repository del vostro account docker hub che sono più vecchie di 50 giorni.
#!/bin/bash
#Script eliminerà tutte le immagini in tutti i repository del tuo account hub Docker che sono più vecchie di 50 giorni
set -e
# imposta nome utente e password
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"
# ottieni il token per poter parlare con 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)
# ottieni l'elenco degli spazi dei nomi accessibili dall'utente (non in uso in questo momento)
#NAMESPACES=$(curl -s -H "Autorizzazione: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r '.namespaces|.[]')
#echo $TOKEN
echo
# ottieni l'elenco dei repository per quell'account utente
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
# crea un elenco di tutte le immagini e i tag
for i in ${REPO_LIST}
do
# ottieni i tag per il repository
IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')
# costruisci un elenco di immagini dai tag
for j in ${IMAGE_TAGS}
do
# aggiungi ogni tag all'elenco
FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
done
done
# elenco di output di tutte le immagini della finestra mobile
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
# Nota!!! Annulla il commento sotto la riga se desideri eseguire operazioni su tutti i repository del tuo account Docker Hub
#per i in ${REPO_LIST}
for i in randomRepo
#NOTA!!! Per eliminare immagini di repository specifici, includi solo quei repository nel ciclo for come di seguito for loop che ha repository mygninx e mykibana
#per io in mynginx mykibana
do
# ottieni i tag per il repository
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')
# costruisci un elenco di immagini dai tag
for j in ${IMAGE_TAGS}
do
echo
# aggiungi l'ora dell'ultimo_aggiornamento
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"
## Si prega di rimuovere il commento sotto la riga per eliminare le immagini dell'hub Docker dei repository hub Docker
#curl -s -X DELETE -H "Autorizzazione: 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 eliminerà tutte le immagini in tutti i repository del tuo account hub Docker che sono più vecchie di "X" giorni
set -e
# imposta il tuo nome utente, password e n. del valore di 'X' giorni nelle righe sottostanti.
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"
# passa nome utente, password e numero di giorni 'X' dal terminale come sotto.
# ./docker-images-remove-script.sh <nome utente> <password> <30>
UNAME=$1
UPASS=$2
X=$3
# ottieni il token per poter parlare con 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
# ottieni l'elenco dei repository per quell'account utente
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
#NOTA!!! Per eliminare immagini di repository specifici, includi solo quei repository in for-loop, come di seguito for-loop che ha repository mysql e mymongo
#for io in mysql mymongo
for rep in ${REPO_LIST}
do
# ottieni il totale n. di immagini e il loro conteggio per un repository
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
# costruisci un elenco di immagini dai tag
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
# Ottieni l'ora dell'ultimo_aggiornamento
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."
#### Nota! PER eliminare un'immagine, rimuovere il commento sotto la riga.
#### curl -s -X DELETE -H "Autorizzazione: 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."