shell scripting

Como eliminar imagens das docas com mais de x dias do centro da doca utilizando um script em forma de concha

Como apagar imagens de docas do centro de atracagem utilizando um script em forma de concha.

Quero apagar todas as imagens do centro portuário com mais de 50 dias de uma conta privada do centro portuário.

Alguma ideia? Que ferramentas utilizar ao criar e executar este script de shell a partir de Jenkins ou de terminal bash.

Estou a pensar em usar o encaracolamento para atingir o meu objectivo.

Abaixo do guião serão apagadas todas as imagens em todos os repositórios da sua conta do centro portuário que tenham mais de 50 dias.

#!/bin/bash
#Script excluirá todas as imagens em todos os repositórios da sua conta do docker hub com mais de 50 dias

set -e

# define usuário e senha
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"

# obtém token para poder falar com o 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)

# obtém lista de namespaces acessíveis pelo usuário (não em uso agora)
#NAMESPACES=$(curl -s -H "Autorização: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r '.namespaces|.[]')

#echo $TOKEN
echo
# obtém lista de repositórios para essa conta de usuário
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
# construir uma lista de todas as imagens e tags
for i in ${REPO_LIST}
do
  # obter tags para repositório
  IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')

  # constrói uma lista de imagens a partir de tags
  for j in ${IMAGE_TAGS}
  do
    # adiciona cada tag à lista
    FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
      
  done
done

# lista de saída de todas as imagens do docker
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
# Observação!!! Por favor, descomentar abaixo da linha se você quiser executar a operação em todos os repositórios da sua conta do Docker Hub
#for i em ${REPO_LIST}

for i in randomRepo

#NOTA!!! Para apagar imagens de repositórios específicos por favor inclua apenas os repositórios em loop for como abaixo for loop que tem repositórios mygninx e mykibana
#para i no mynginx mykibana

do
  # obter tags para repositório
  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')

  # constrói uma lista de imagens a partir de tags
  for j in ${IMAGE_TAGS}
  do
      echo
      # adiciona 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 a linha abaixo para excluir imagens do docker hub dos repositórios do docker hub
              #curl -s -X DELETE -H "Autorização: 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 excluirá todas as imagens em todos os repositórios da sua conta do docker hub com mais de 'X' dias
set -e

# defina seu nome de usuário, senha e não. do valor de 'X' dias nas linhas abaixo.
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"

# passe nome de usuário, senha e nenhum valor de 'X' dias do terminal conforme a linha abaixo.
# ./docker-images-remove-script.sh <username> <password> <30>
UNAME=$1
UPASS=$2
X=$3

# obtém token para poder falar com o 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
# obtém lista de repositórios para essa conta de usuário
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 excluir imagens de repositórios específicos, inclua apenas os repositórios em for-loop, como abaixo for-loop, que possui repos mysql e mymongo
#for i no mysql mymongo

for rep in ${REPO_LIST}
 

do
    # obter um número total. de imagens e sua contagem para um repositório
    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

             # constrói uma lista de imagens a partir de 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
                  # Obter 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."
                  #### Observação! PARA excluir uma imagem, por favor, descomente abaixo da linha.
                  #### curl -s -X DELETE -H "Autorização: 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."