Skip to content

Instantly share code, notes, and snippets.

@virtualbeck
Last active February 18, 2024 02:32
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save virtualbeck/a635ef6701991f2087384eab7edbb18b to your computer and use it in GitHub Desktop.
Save virtualbeck/a635ef6701991f2087384eab7edbb18b to your computer and use it in GitHub Desktop.
copy n number of tagged docker images from one aws ecr account to another
#!/bin/bash
set -e
################################# UPDATE THESE #################################
LAST_N_TAGS=10
SOURCE_REGION="us-west-1"
DESTINATION_REGION="us-east-1"
SOURCE_PROFILE="profile_1"
DESTINATION_PROFILE="profile_2"
SOURCE_BASE_PATH="123456.dkr.ecr.$SOURCE_REGION.amazonaws.com"
DESTINATION_BASE_PATH="567890.dkr.ecr.$DESTINATION_REGION.amazonaws.com"
#################################################################################
URI=($(aws ecr describe-repositories --query 'repositories[].repositoryUri' --output text --region $SOURCE_REGION))
NAME=($(aws ecr describe-repositories --query 'repositories[].repositoryName' --output text --region $SOURCE_REGION))
echo "Start repo copy: `date`"
# source account login
aws --profile $SOURCE_PROFILE --region $SOURCE_REGION ecr get-login-password | docker login --username AWS --password-stdin $SOURCE_BASE_PATH
# destination account login
aws --profile $DESTINATION_PROFILE --region $DESTINATION_REGION ecr get-login-password | docker login --username AWS --password-stdin $DESTINATION_BASE_PATH
for i in ${!URI[@]}; do
echo "====> Grabbing latest $LAST_N_TAGS from ${NAME[$i]} repo"
# create ecr repo if one does not exist in destination account
aws ecr describe-repositories --repository-names ${NAME[$i]} || aws ecr create-repository --repository-name ${NAME[$i]}
for tag in $(aws ecr describe-images --repository-name ${NAME[$i]} \
--query 'sort_by(imageDetails,& imagePushedAt)[*]' \
--filter tagStatus=TAGGED --output text \
| grep IMAGETAGS | awk '{print $2}' | tail -$LAST_N_TAGS); do
echo "start pulling image ${URI[$i]}:$tag"
docker pull ${URI[$i]}:$tag
docker tag ${URI[$i]}:$tag $DESTINATION_BASE_PATH/${NAME[$i]}:$tag
echo "start pushing image $DESTINATION_BASE_PATH/${NAME[$i]}:$tag"
docker push $DESTINATION_BASE_PATH/${NAME[$i]}:$tag
echo ""
done
done
echo "Finish repo copy: `date`"
echo "Don't forget to purge you local docker images!"
#Uncomment to delete all
#docker rmi $(for i in ${!NAME[@]}; do docker images | grep ${NAME[$i]} | tr -s ' ' | cut -d ' ' -f 3 | uniq; done) -f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment