Skip to content

Instantly share code, notes, and snippets.

@jyxjjj
Last active April 29, 2025 09:47
Show Gist options
  • Save jyxjjj/3d010135e3f9893489bf8dcaa6efafbb to your computer and use it in GitHub Desktop.
Save jyxjjj/3d010135e3f9893489bf8dcaa6efafbb to your computer and use it in GitHub Desktop.
#!/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