|
| 1 | +#!/bin/sh -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="https://$(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 | + # 인증 헤더 설정 |
| 27 | + local AUTH_HEADER="" |
| 28 | + if [[ -n "$USERNAME" && -n "$PASSWORD" ]]; then |
| 29 | + AUTH_HEADER="Authorization: Basic $(echo -n "$USERNAME:$PASSWORD" | base64)" |
| 30 | + fi |
| 31 | + |
| 32 | + local MANIFEST=$(curl -s -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -H "$AUTH_HEADER" "$REGISTRY_URL/v2/$REPO_PATH/manifests/$CURRENT_TAG") |
| 33 | + |
| 34 | + if [[ $? -ne 0 ]]; then |
| 35 | + echo "Error: Failed to fetch manifest for tag '$CURRENT_TAG'" |
| 36 | + return 1 |
| 37 | + fi |
| 38 | + |
| 39 | + echo "Adding new tag '$NEW_TAG'..." |
| 40 | + local RESULT=$(curl -s -X PUT \ |
| 41 | + -H "Content-Type: application/vnd.docker.distribution.manifest.v2+json" \ |
| 42 | + -H "$AUTH_HEADER" \ |
| 43 | + -d "$MANIFEST" \ |
| 44 | + "$REGISTRY_URL/v2/$REPO_PATH/manifests/$NEW_TAG") |
| 45 | + |
| 46 | + if [[ $? -ne 0 ]]; then |
| 47 | + echo "Error: Failed to add tag '$NEW_TAG': $RESULT" |
| 48 | + return 1 |
| 49 | + fi |
| 50 | + |
| 51 | + echo "Successfully added tag '$NEW_TAG' to $IMAGE_PATH" |
| 52 | +} |
| 53 | + |
| 54 | + |
| 55 | +TAG_TO_ADD=$1 |
| 56 | +DOCKER_REGISTRY=$2 |
| 57 | +TOKEN=$3 |
| 58 | + |
| 59 | +if [ -z "$TAG_TO_ADD" ] || [ -z "$DOCKER_REGISTRY" ]; then |
| 60 | + echo "Usage: echo -e 'image1\\nimage2\\nimage3' | $0 <tag_to_add> <docker_registry> [token]" |
| 61 | + exit 1 |
| 62 | +fi |
| 63 | + |
| 64 | +# stdin에서 이미지 목록을 배열로 읽기 |
| 65 | +mapfile -t IMAGES |
| 66 | + |
| 67 | +if [ ${#IMAGES[@]} -eq 0 ]; then |
| 68 | + echo "Error: No images found" |
| 69 | + exit 1 |
| 70 | +fi |
| 71 | + |
| 72 | +# if ECR |
| 73 | +if [[ "$DOCKER_REGISTRY" == *".dkr.ecr."* ]]; then |
| 74 | + TOKEN=$(aws ecr get-login-password --region us-east-1) |
| 75 | +fi |
| 76 | + |
| 77 | +if [[ -z "$TOKEN" && "$DOCKER_REGISTRY" == *".dkr.ecr."* ]]; then |
| 78 | + echo "Token is empty" |
| 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 | + if [[ $IMAGE == *".dkr.ecr."* ]]; then |
| 89 | + USERNAME="AWS" |
| 90 | + else |
| 91 | + USERNAME=$(echo "$IMAGE" | cut -d'/' -f1) |
| 92 | + fi |
| 93 | + |
| 94 | + echo "add_docker_tag $IMAGE $TAG_TO_ADD $USERNAME ****" |
| 95 | + add_docker_tag "$IMAGE" "$TAG_TO_ADD" "$USERNAME" "$TOKEN" & |
| 96 | +done |
| 97 | +wait |
| 98 | + |
0 commit comments