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."