도커 이미지 일괄 태깅·푸시 및 정리 자동화 Bash 스크립트

💡 핵심 요약 (Executive Summary)

본 가이드는 bash docker control image.sh 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.

📑 Table of Contents

V5

  • image tag & push
bash
cat <<EOF >> tmp.sh
  repository=ghcr.io/myeong-han
  $(docker images | grep -Ev 'REPOSITORY' | awk '{ img = $1; sub(/.*\//, "", img); print "docker tag " $1 ":" $2 " $repository/" img ":" $2 }')
  $(docker images | grep -Ev 'REPOSITORY' | awk '{ img = $1; sub(/.*\//, "", img); print "docker push " "$repository/" img ":" $2 }')
  EOF

  chmod +x tmp.sh
  ./tmp.sh

V4

  • image pull & tag & push for needed
bash
#!/bin/bash

  #k get deployments.apps,sts -n management-system -o custom-columns='name:.metadata.name,image:.spec.template.spec.containers[].image,kind:.kind' --no-headers | awk '{print $2}' | uniq
  images="
  "
  new_repo=harbor.Enterprise Cloud.myregistry.internal.com/management

  for image in $images; do
          #docker pull $image
          i=$(echo ${image##*/} | cut -d':' -f1)
          t=$(echo $image | cut -d':' -f2 | cut -d'@' -f1)
          repo=$(echo $image | sed "s/\/${i}\:${t}//g")
          echo "repo=$repo image=$i tag=$t"

          docker tag $repo/$i:$t $new_repo/$i:$t
          docker push $new_repo/$i:$t
  done
  • load files in this dir
bash
#!/bin/bash

  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  files="
  $(find ${SCRIPT_DIR} -type f -printf '%f\n')
  "
  for file in $files; do
          docker load -i $file
  done
  • tagging
bash
old_image_fulls="$(docker images | grep latest | grep Enterprise Cloud | awk '{print $1}' | sed 's/$/\:latest/g')"
  new_repo="harbor.Enterprise Cloud.myregistry.internal.com/dev-portal"

  for old_image_full in $old_image_fulls; do
          image="$(echo $old_image_full | sed 's/harbor\.Enterprise Cloud\.myregistry.internal\.com\/infra\///g')"
          echo "docker tag $old_image_full $new_repo/$image"
          docker tag $old_image_full $new_repo/$image
          docker push $new_repo/$image
  done

V1

Image pull&pusher
  1. K8s이미지를 도커 리포지토리에서 pull
  2. tag 지정
  3. REPO (지정 harbor)에 push
Reference & Guidelines (NOTE)

인터넷이 가능하며 docker가 설치된 환경이어야 한다.

Archi 확인
bash
#!/bin/bash
IMAGES=$(sudo docker images | sed '1d' | awk '{print $1 ":" $2}')

for IMAGE in $IMAGES
do
  sudo docker image inspect $IMAGE | jq ".[0].Architecture"
done
Tagging
Reference & Guidelines (NOTE)

docker hub에서 다운로드 받은 이미지에 특정 repository를 태깅

bash
#!/bin/bash
REPO=""
IMAGES=$(sudo docker images | sed '1d' | awk '{print $1 ":" $2}')

for IMAGE in $IMAGES
do
  sudo docker tag $IMAGE ${REPO}/${IMAGE}
done
Reference & Guidelines (NOTE)

특정 asis repository를 특정 tobe repository로 태깅

bash
#!/bin/bash
ASIS_REPO=""
TOBE_REPO=""
ASIS_IMAGES=$(sudo docker images | sed '1d' | grep "$ASIS_REPO" | awk '{print $1 ":" $2}')
for ASIS_IMAGE in $ASIS_IMAGES
do
  IMAGE=$(echo "$ASIS_IMAGE" | grep -v "${ASIS_REPO}/")
  sudo docker tag $ASIS_IMAGE ${TOBE_REPO}/${IMAGE}
done
Saving
bash
#!/bin/bash
REPO=""
IMAGES=$(sudo docker images | sed '1d' | grep "$REPO" | awk '{print $1 ":" $2}')
#sudo docker images | sed '1d' | grep "harbor.viola.ssis.or.kr/ssis-test" | awk '{print $1 ":" $2}' | sed 's/harbor.viola.ssis.or.kr\/ssis-test\///' | sed 's/\:/-/' | sed 's/$/.tar/'
for IMAGE in $IMAGES
do
  sudo docker save -o $(echo $IMAGE | sed "s#${REPO}/##" | sed 's/\:/-/').tar $IMAGE
done
Pull & Push
bash
#!bin/bash
REPO=harbor.Enterprise Cloud.cld/k8s
IMAGES=$( cat << EOF
{{ Load Stack for myversion }}
EOF
)

for i in $IMAGES
do
  echo "*** $i ***"
  docker pull --platform linux/amd64 $i 
  docker tag $i $REPO/$i
  docker push $REPO/$i
done
Pull & Save
bash
#!bin/bash
REPO=cmp-registry.hana.com:29143/cmp
IMAGES=$( cat << EOF
{{ Load Stack for myversion }}
EOF
)
FILE_SEQ=0
ADD=1

for i in $IMAGES
do
  FILE_SEQ=$(expr $FILE_SEQ + $ADD)
  echo "*** $i ***"
  docker pull --platform linux/amd64 $i
  docker tag $i $REPO/$i
  docker save -o $FILE_SEQ.tar $i
done
Stack
k8s_v1.24.6
bash
docker.io/library/busybox:latest
docker.io/calico/cni:v3.23.3
docker.io/calico/kube-controllers:v3.23.3
docker.io/calico/node:v3.23.3
docker.io/calico/pod2daemon-flexvol:v3.23.3
docker.io/library/nginx:1.23.0-alpine
k8s.gcr.io/coredns/coredns:v1.8.6
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/cpa/cluster-proportional-autoscaler-amd64:1.8.5
k8s.gcr.io/dns/k8s-dns-node-cache:1.21.1
k8s.gcr.io/kube-apiserver:v1.24.6
k8s.gcr.io/kube-controller-manager:v1.24.6
k8s.gcr.io/kube-proxy:v1.24.6
k8s.gcr.io/kube-scheduler:v1.24.6
k8s.gcr.io/pause:3.6
k8s.gcr.io/pause:3.7
k8s_v1.23.7
bash
docker.io/calico/node:v3.22.3
docker.io/calico/kube-controllers:v3.22.3
docker.io/library/busybox:latest
k8s.gcr.io/coredns:v1.8.6
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/kube-apiserver:v1.23.7
k8s.gcr.io/kube-controller-manager:v1.23.7
k8s.gcr.io/kube-proxy:v1.23.7
k8s.gcr.io/kube-scheduler:v1.23.7
k8s.gcr.io/pause:3.6
k8s.gcr.io/pause:3.7
k8s.gcr.io/cpa/cluster-proportional-autoscaler-amd64:1.8.5

V2

rmi.sh
bash
#!bin/bash
images=($(docker images | sed '1d' | awk '{print $1 ":" $2}'))

for image in "${images[@]}" do
	docker rmi $image
done
rmiv2.sh
bash
for image in $(docker images -q); do
  docker rmi $image  # ← 스페이스 두 개 or 네 개로 들여쓰기
done
container image deploy
bash
#!/bin/bash

## Input Parameters
#MODULES=(admin-api admin-app dashboard-api dashboard-app openstack-api openstack-app service-catalog-engine cloud-service-broker)
MODULES=(openstack-api)
TAG=v3.0.3.41

ASIS_REGISTRY=harbor.Enterprise Cloud.cld:5000/prod
TOBE_REGISTRY=registry.myregistry.internal.com:443/cmp-portal

PWD_PATH=$(pwd)

SSH_ADDR=sychoi@<PUBLIC_IP_REDACTED>
SSH_PORT=7522
SSH_PATH=html/cmp

CONTAINER_BINARY=nerdctl

rm -rf $PWD_PATH/v3.*
mkdir $PWD_PATH/$TAG
ssh -p$SSH_PORT $SSH_ADDR mkdir $SSH_PATH/$TAG

for MODULE in ${MODULES[@]};
do
    echo "==================$MODULE IMAGE PULLING=================="
    $CONTAINER_BINARY pull $ASIS_REGISTRY/$MODULE:$TAG
    echo "==================$MODULE IMAGE TAGGING=================="
    $CONTAINER_BINARY tag $ASIS_REGISTRY/$MODULE:$TAG $TOBE_REGISTRY/$MODULE:$TAG
    echo "$MODULE image registry changed $ASIS_REGISTRY/$MODULE:$TAG to $TOBE_REGISTRY/$MODULE:$TAG"
    echo "==================$MODULE IMAGE SAVING=================="
    $CONTAINER_BINARY save -o $PWD_PATH/$TAG/$MODULE.tar $TOBE_REGISTRY/$MODULE:$TAG
    echo "image saved $PWD_PATH/$TAG/$MODULE.tar"
    echo "==================$MODULE IMAGE SENDING=================="
    ssh -p$SSH_PORT $SSH_ADDR rm -rf $SSH_PATH/$TAG/$MODULE.tar
    scp -P$SSH_PORT $PWD_PATH/$TAG/$MODULE.tar $SSH_ADDR:$SSH_PATH/$TAG/
    ssh -p$SSH_PORT $SSH_ADDR ls $SSH_PATH/$TAG/ -al
done

V3

이미지 Load 예제
bash
container_bin=docker
for file in *.tar; do
    if [[ -f "$file" ]]; then
        echo "Processing $file..."
        $container_bin load -i "$file"
    fi
done
이미지 tag 및 push 예제
bash
container_bin=docker
asis_repository=harbor.myregistry.internal.com:31443
asis_project=stg-portal
tobe_repository={{ input }}
tobe_project={{ input }}
ori_images=$(docker images | grep "$asis_repository/$asis_project" | awk '{ print $1 ":" $2 }' | sort | uniq)
images=($(echo $ori_images | sed "s/$asis_repository\/$asis_project\///g"))

for im in ${images[@]}; do
		echo "Processing image: $im"
		$container_bin tag $asis_repository/$asis_project/$im $tobe_repository/$tobe_project/$im
		$container_bin push $tobe_repository/$tobe_project/$im
done

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *