Last active
April 29, 2025 09:47
-
-
Save jyxjjj/3d010135e3f9893489bf8dcaa6efafbb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
set -e | |
DESTINATION_REGISTRY="registry.example.com" | |
IMAGES=( | |
"docker.io library/fedora latest 42" | |
"docker.io library/mariadb lts 11.4.5" | |
"docker.io library/redis latest 7.4.3" | |
"docker.io adguard/adguardhome latest v0.107.61" | |
"codeberg.org forgejo/forgejo NULL 11.0.0" | |
) | |
#region FUNCTIONS | |
function checkImage() { | |
REGISTRY=$1 | |
IMAGE_NAME=$2 | |
IMAGE_TAG=$3 | |
IMAGE_VERSION=$4 | |
if [[ "$IMAGE_TAG" == "NULL" ]]; then | |
echo -e "\033[32m$IMAGE_NAME:$IMAGE_VERSION is up to date\033[0m" | |
return 0 | |
fi | |
L=$(skopeo inspect --override-arch amd64 --override-os linux docker://$REGISTRY/$IMAGE_NAME:$IMAGE_TAG | jq -r '.Digest') | |
R=$(skopeo inspect --override-arch amd64 --override-os linux docker://$REGISTRY/$IMAGE_NAME:$IMAGE_VERSION | jq -r '.Digest') | |
if [ "$L" == "$R" ]; then | |
echo -e "\033[32m$IMAGE_NAME:$IMAGE_VERSION is up to date\033[0m" | |
return 0 | |
fi | |
echo -e "\033[31m$IMAGE_NAME:$IMAGE_VERSION is outdated\033[0m" | |
echo -e "\033[31m$L != $R\033[0m" | |
return 1 | |
} | |
function syncImageTag() { | |
REGISTRY=$1 | |
IMAGE_NAME=$2 | |
IMAGE_TAG=$3 | |
echo "================================================================" | |
echo -e "\033[34mSyncing $IMAGE_NAME:$IMAGE_TAG...\033[0m" | |
skopeo copy \ | |
--dest-precompute-digests \ | |
--preserve-digests \ | |
--retry-times 10 \ | |
--override-arch amd64 --override-os linux \ | |
docker://$REGISTRY/$IMAGE_NAME:$IMAGE_TAG docker://$DESTINATION_REGISTRY/$IMAGE_NAME:$IMAGE_TAG | |
echo -e "\033[32mSuccessfully synced $IMAGE_NAME:$IMAGE_TAG\033[0m" | |
echo "================================================================" | |
} | |
function tagImage() { | |
REGISTRY=$1 | |
IMAGE_NAME=$2 | |
IMAGE_VERSION=$3 | |
echo "================================================================" | |
echo -e "\033[34mTagging $IMAGE_NAME:$IMAGE_VERSION...\033[0m" | |
skopeo copy \ | |
--dest-precompute-digests \ | |
--preserve-digests \ | |
--retry-times 10 \ | |
--override-arch amd64 --override-os linux \ | |
docker://$DESTINATION_REGISTRY/$IMAGE_NAME:$IMAGE_VERSION docker://$DESTINATION_REGISTRY/$IMAGE_NAME:latest | |
echo -e "\033[32mSuccessfully tagged $IMAGE_NAME:$IMAGE_VERSION\033[0m" | |
echo "================================================================" | |
} | |
function syncImage() { | |
REGISTRY=$1 | |
IMAGE_NAME=$2 | |
IMAGE_TAG=$3 | |
IMAGE_VERSION=$4 | |
if [[ "$IMAGE_TAG" == "NULL" ]]; then | |
syncImageTag $REGISTRY $IMAGE_NAME $IMAGE_VERSION | |
tagImage $REGISTRY $IMAGE_NAME $IMAGE_VERSION | |
else | |
syncImageTag $REGISTRY $IMAGE_NAME $IMAGE_TAG | |
syncImageTag $REGISTRY $IMAGE_NAME $IMAGE_VERSION | |
fi | |
} | |
function checkAndSyncImage() { | |
REGISTRY=$1 | |
IMAGE_NAME=$2 | |
IMAGE_TAG=$3 | |
IMAGE_VERSION=$4 | |
if checkImage $REGISTRY $IMAGE_NAME $IMAGE_TAG $IMAGE_VERSION; then | |
syncImage $REGISTRY $IMAGE_NAME $IMAGE_TAG $IMAGE_VERSION | |
else | |
echo -e "\033[31mFailed to sync $IMAGE_NAME\033[0m" | |
fi | |
} | |
function deleteImage() { | |
IMAGE_NAME=$1 | |
IMAGE_TAG=$2 | |
echo -e "\033[33mDeleting $IMAGE_NAME:$IMAGE_TAG...\033[0m" | |
skopeo delete --override-arch amd64 --override-os linux docker://$DESTINATION_REGISTRY/$IMAGE_NAME:$IMAGE_TAG | |
} | |
#endregion | |
#region STARTUP | |
if [[ $# -eq 0 ]]; then | |
echo -e "\033[31mNo arguments supplied\033[0m" | |
echo "Usage: ./registry.sh [check|sync]" | |
echo "Usage: ./registry.sh [delete] [ImageName] [ImageTag]" | |
exit 1 | |
elif [[ $1 == "help" ]]; then | |
echo "Usage: ./registry.sh [check|sync]" | |
echo "Usage: ./registry.sh [delete] [ImageName] [ImageTag]" | |
exit 0 | |
elif [[ $1 == "delete" ]]; then | |
if [ $# -ne 3 ]; then | |
echo -e "\033[31mInvalid arguments supplied\033[0m" | |
echo "Usage: ./registry.sh delete [ImageName] [ImageTag]" | |
exit 1 | |
fi | |
# 删除镜像 | |
deleteImage "$2" "$3" | |
exit 0 | |
elif [[ $1 == "check" ]]; then | |
for IMAGE in "${IMAGES[@]}"; do | |
# 仅检查版本 | |
IFS=' ' read -r REGISTRY IMAGE_NAME IMAGE_TAG IMAGE_VERSION <<<"$IMAGE" | |
checkImage $REGISTRY $IMAGE_NAME $IMAGE_TAG $IMAGE_VERSION & | |
done | |
wait | |
exit 0 | |
elif [[ $1 == "sync" ]]; then | |
for IMAGE in "${IMAGES[@]}"; do | |
# 检查并同步镜像 | |
IFS=' ' read -r REGISTRY IMAGE_NAME IMAGE_TAG IMAGE_VERSION <<<"$IMAGE" | |
checkAndSyncImage $REGISTRY $IMAGE_NAME $IMAGE_TAG $IMAGE_VERSION | |
done | |
exit 0 | |
else | |
echo -e "\033[31mInvalid arguments supplied\033[0m" | |
echo "Usage: ./registry.sh [check|sync]" | |
echo "Usage: ./registry.sh [delete] [ImageName] [ImageTag]" | |
exit 1 | |
fi | |
#endregion |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment