shell scripting

Cómo eliminar imágenes docker de más de x días del docker hub mediante un script de shell

Cómo eliminar imágenes docker del docker hub utilizando un script de shell.

Quiero eliminar todas las imágenes del docker hub con más de 50 días de antigüedad de una cuenta docker hub privada.

¿Alguna idea? Qué herramientas utilizar al crear y ejecutar este script de shell,ya sea a través de Jenkins o terminal bash.

Estoy pensando en utilizar el rizo para lograr mi objetivo.





El siguiente script eliminará todas las imágenes en todos los repositorios de su cuenta docker hub que tengan más de 50 días.

#!/bin/bash
#Script eliminará todas las imágenes en todos los repositorios de su cuenta de docker hub que tengan más de 50 días

set -e

# establecer nombre de usuario y contraseña
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"

# obtener token para poder hablar 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)

# obtener una lista de los espacios de nombres accesibles por el usuario (no en uso en este momento)
#NAMESPACES=$(curl -s -H "Autorización: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r '.namespaces|.[]')

#echo $TOKEN
echo
# obtener una lista de repositorios para esa cuenta de usuario
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
# crear una lista de todas las imágenes y etiquetas
for i in ${REPO_LIST}
do
  # obtener etiquetas para el repositorio
  IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')

  # crear una lista de imágenes a partir de etiquetas
  for j in ${IMAGE_TAGS}
  do
    # agregar cada etiqueta a la lista
    FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
      
  done
done

# lista de salida de todas las imágenes de la ventana acoplable
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!!! Descomente la siguiente línea si desea realizar una operación en todos los repositorios de su cuenta de Docker Hub
#para i en ${REPO_LIST}

for i in randomRepo

#¡¡¡NOTA!!! Para eliminar imágenes de repositorios específicos, incluya solo aquellos repositorios en bucle for como el siguiente bucle for que tiene repositorios mygninx y mykibana
#para mí en mynginx mykibana

do
  # obtener etiquetas para el repositorio
  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')

  # crear una lista de imágenes a partir de etiquetas
  for j in ${IMAGE_TAGS}
  do
      echo
      # agregar 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"
              ## Descomente debajo de la línea para eliminar las imágenes de Docker Hub de los repositorios de Docker Hub
              #curl -s -X DELETE -H "Autorización: 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 eliminará todas las imágenes en todos los repositorios de su cuenta de docker hub que tengan más de 'X' días
set -e

# establezca su nombre de usuario, contraseña y no. del valor de 'X' días en las líneas siguientes.
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"

# pase el nombre de usuario, la contraseña y el valor de 'X' días desde la terminal como se muestra a continuación.
# ./docker-images-remove-script.sh <nombre de usuario> <contraseña> <30>
UNAME=$1
UPASS=$2
X=$3

# obtener token para poder hablar 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
# obtener una lista de repositorios para esa cuenta de usuario
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!!! Para eliminar imágenes de repositorios específicos, incluya solo esos repositorios en for-loop, como debajo de for-loop que tiene repositorios mysql y mymongo
#para i en mymongo mysql

for rep in ${REPO_LIST}
 

do
    # obtener el número total de imágenes y su recuento para un repositorio
    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

             # crear una lista de imágenes a partir de etiquetas
             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
                  # Obtener 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."
                  #### ¡Nota! PARA eliminar una imagen, elimine el comentario debajo de la línea.
                  #### curl -s -X DELETE -H "Autorización: 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."