|
| 1 | +#!/bin/bash -e |
| 2 | + |
| 3 | +add_docker_tag() { |
| 4 | + local IMAGE_PATH="$1" |
| 5 | + local NEW_TAG="$2" |
| 6 | + local USERNAME="$3" |
| 7 | + local PASSWORD="$4" |
| 8 | + |
| 9 | + local REGISTRY_URL=$(echo $IMAGE_PATH | cut -d'/' -f1) |
| 10 | + local REPO_PATH=$(echo $IMAGE_PATH | cut -d'/' -f2- | cut -d':' -f1) |
| 11 | + local CURRENT_TAG=$(echo $IMAGE_PATH | cut -d':' -f2) |
| 12 | + |
| 13 | + # 붙일 태그가 없으면 에러 |
| 14 | + if [[ -z "$CURRENT_TAG" ]]; then |
| 15 | + echo "Error: Current tag not found in image path '$IMAGE_PATH'" |
| 16 | + return 1 |
| 17 | + fi |
| 18 | + |
| 19 | + if [[ -z "$NEW_TAG" ]]; then |
| 20 | + echo "Error: New tag is empty" |
| 21 | + return 1 |
| 22 | + fi |
| 23 | + |
| 24 | + echo "Start tagging: $REGISTRY_URL/$REPO_PATH, $CURRENT_TAG -> $NEW_TAG" |
| 25 | + |
| 26 | + local SOURCE_IMAGE="docker://$REGISTRY_URL/$REPO_PATH:$CURRENT_TAG" |
| 27 | + local DEST_IMAGE="docker://$REGISTRY_URL/$REPO_PATH:$NEW_TAG" |
| 28 | + |
| 29 | + local AUTH_OPTS="" |
| 30 | + if [[ -n "$USERNAME" && -n "$PASSWORD" ]]; then |
| 31 | + echo "Using provided credentials for authentication: user=$USERNAME password=$PASSWORD" |
| 32 | + AUTH_OPTS="--src-creds $USERNAME:$PASSWORD --dest-creds $USERNAME:$PASSWORD" |
| 33 | + fi |
| 34 | + |
| 35 | + echo "Adding new tag '$NEW_TAG'..." |
| 36 | + |
| 37 | + if skopeo copy $AUTH_OPTS "$SOURCE_IMAGE" "$DEST_IMAGE"; then |
| 38 | + echo "Successfully added tag '$NEW_TAG' to $IMAGE_PATH" |
| 39 | + return 0 |
| 40 | + else |
| 41 | + echo "Error: Failed to add tag '$NEW_TAG'" |
| 42 | + return 1 |
| 43 | + fi |
| 44 | +} |
| 45 | + |
| 46 | + |
| 47 | +TAG_TO_ADD=$1 |
| 48 | +DOCKER_REGISTRY=$2 |
| 49 | +TOKEN=$3 |
| 50 | + |
| 51 | +if [ -z "$TAG_TO_ADD" ] || [ -z "$DOCKER_REGISTRY" ]; then |
| 52 | + echo "Usage: echo -e 'image1\\nimage2\\nimage3' | $0 <tag_to_add> <docker_registry> [token]" |
| 53 | + exit 1 |
| 54 | +fi |
| 55 | + |
| 56 | +# if ECR |
| 57 | +if [[ "$DOCKER_REGISTRY" == *".dkr.ecr."* ]]; then |
| 58 | + USERNAME="AWS" |
| 59 | + PASSWORD=$(aws ecr get-login-password --region us-east-1) |
| 60 | +else |
| 61 | + USERNAME=$(echo "$TOKEN" | base64 -d | cut -d: -f1) |
| 62 | + PASSWORD=$(echo "$TOKEN" | base64 -d | cut -d: -f2) |
| 63 | +fi |
| 64 | + |
| 65 | +if [[ -z "$PASSWORD" && "$DOCKER_REGISTRY" == *".dkr.ecr."* ]]; then |
| 66 | + echo "Error: ECR token is required for ECR registry" |
| 67 | + exit 1 |
| 68 | +fi |
| 69 | + |
| 70 | +if [[ -z "$TOKEN" ]]; then |
| 71 | + echo "Error: Token is required for non-ECR registry" |
| 72 | + exit 1 |
| 73 | +fi |
| 74 | + |
| 75 | +# stdin에서 이미지 목록을 배열로 읽기 |
| 76 | +mapfile -t IMAGES |
| 77 | +if [ ${#IMAGES[@]} -eq 0 ]; then |
| 78 | + echo "Error: No images found" |
| 79 | + exit 1 |
| 80 | +fi |
| 81 | + |
| 82 | +for IMAGE in "${IMAGES[@]}"; do |
| 83 | + if [[ $IMAGE != *"$DOCKER_REGISTRY"* ]]; then |
| 84 | + echo "Skipping: $IMAGE (not from $DOCKER_REGISTRY)" |
| 85 | + continue |
| 86 | + fi |
| 87 | + |
| 88 | + echo "add_docker_tag $IMAGE $TAG_TO_ADD $USERNAME" |
| 89 | + add_docker_tag "$IMAGE" "$TAG_TO_ADD" "$USERNAME" "$PASSWORD" & |
| 90 | +done |
| 91 | +wait |
| 92 | + |
0 commit comments