shell scripting

シェルスクリプトを使用して、x日以上前のdockerイメージをdocker hubから削除する方法

シェルスクリプトを使用して、Docker HubからDockerイメージを削除する方法。

docker hubのプライベートアカウントで、過去50日分より古いイメージをdocker hubからすべて削除したい。

何かアイデアはありますか?Jenkinsまたはbashターミナルのいずれかからこのシェルスクリプトを作成し、実行する際に使用するツールは何ですか?

目標を達成するために、カールを使おうと思っています。


以下のスクリプトは、Docker Hub アカウントのすべてのリポジトリにある、50 日以上前のイメージをすべて削除します。

#!/bin/bash
#Scriptは、DockerHubアカウントのすべてのリポジトリにある50日以上経過したすべての画像を削除します

set -e

#ユーザー名とパスワードを設定する
UNAME="YOUR_USERNAME"
UPASS="YOUR_PASSWORD"

#トークンを取得してDockerHubと通信できるようにする
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)

#ユーザーがアクセスできる名前空間のリストを取得します(現在は使用されていません)
#NAMESPACES = $(curl -s -H "認証:JWT $ {TOKEN}" https://hub.docker.com/v2/repositories/namespaces/ | jq -r'.namespaces|。[]')

#echo $TOKEN
echo
#そのユーザーアカウントのリポジトリのリストを取得する
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
#すべての画像とタグのリストを作成する
for i in ${REPO_LIST}
do
  #リポジトリのタグを取得
  IMAGE_TAGS=$(curl -s -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${UNAME}/${i}/tags/?page_size=10000 | jq -r '.results|.[]|.name')

  #タグから画像のリストを作成する
  for j in ${IMAGE_TAGS}
  do
    #各タグをリストに追加
    FULL_IMAGE_LIST="${FULL_IMAGE_LIST} ${UNAME}/${i}:${j}"
      
  done
done

#すべての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
# ノート!!!Docker Hubアカウントのすべてのリポジトリで操作を実行する場合は、以下の行のコメントを解除してください
#for i in ${REPO_LIST}

for i in randomRepo

#ノート!!!特定のリポジトリイメージを削除するには、以下のように、リポジトリmygninxとmykibanaを持つforループにそれらのリポジトリのみを含めてください。
#for i in  mynginx mykibana

do
  #リポジトリのタグを取得
  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')

  #タグから画像のリストを作成する
  for j in ${IMAGE_TAGS}
  do
      echo
      #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"
              ## DockerHubリポジトリのDockerHubイメージを削除するには、以下の行のコメントを解除してください
              #curl -s -X DELETE -H "認証: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は、DockerHubアカウントのすべてのリポジトリにある「X」日より古いすべての画像を削除します
set -e

#ユーザー名、パスワード、および番号を設定します。以下の行の「X」日の値。
#UNAME="YOUR_USERNAME"
#UPASS="YOUR_PASSWORD"
#X="YOUR_DAYS_VALUE"

#以下の行のように、端末からユーザー名、パスワード、および「X」日の値を渡します。
#。/docker-images-remove-script.sh<ユーザー名><パスワード><30>
UNAME=$1
UPASS=$2
X=$3

#トークンを取得してDockerHubと通信できるようにする
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
#そのユーザーアカウントのリポジトリのリストを取得する
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

#ノート!!!特定のリポジトリイメージを削除するには、以下のように、リポジトリmysqlとmymongoを持つforループのように、それらのリポジトリのみをforループに含めてください。
#mysqlmymongoのi

for rep in ${REPO_LIST}
 

do
    #合計数を取得します。画像の数とレポの数
    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

             #タグから画像のリストを作成する
             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
                  #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."
                  #### ノート!画像を削除するには、下の行のコメントを外してください。
                  #### curl -s -X DELETE -H "認証: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."