Container Registry 정리하기

Harrison Jung·2022년 1월 30일
0

GCP CI/CD

목록 보기
1/3
post-thumbnail

GCP에서 Cloud Build를 하면 빌드된 이미지는 Container Registry에 등록이 됩니다. 등록만 Container Registry에 등록이 될뿐 실제 파일 저장은 Cloud Storage에 저장이 됩니다.

좀 더 자세히 살펴보겠습니다.
우리가 Cloud Build를 하면 빌드하는 과정에 관한 로그는 기본적으로 Cloud Storage(GCS) 에 저장이 됩니다. 역시 빌드하는 Source또한 GCS에 저장되죠.
다만, 옵션을 선택하기에 따라서 Container Registry를 이용할 경우에는 GCS에 빌드된 이미지가, Artifact Registry를 선택하면 GCS가 아닌 Artifact Registry에 저장이 됩니다.

아무튼 문제는 이게 GCS에 차곡차곡 쌓인다는건데, 저희 회사의 경우에는 그동안 수많은 빌드를 한 결과가 GCS에 차곡차곡 쌓여서 중간에 수동으로 삭제했던 데이터들을 합치면 대략 2TB에 달하는 도커 이미지가 GCS에 쌓였습니다.

사실, 오래된 도커이미지는 아무런 쓸모가 없기 때문에 오래된 이미지는 삭제해주는것이 좋습니다. 다 비용이니까요.


순서는 다음과 같습니다.
1. Container Registry에 등록된 이미지 목록을 불러온다.
2. 각 이미지에 있는 tag 목록을 불러온다.
3. 이미지를 삭제한다.


다음과 같은 코드를 이용하면 Container Registry에서 모든 이미지를 불러올 수 있습니다.

const { execSync } = require("child_process");

const imageFolderList = ["asia.gcr.io/[PROJECT ID]"];
const imageLists = [];

while (imageFolderList.length) {
    const targetFolder = imageFolderList.pop();
    console.log(`Loading...${targetFolder}`);

    const image = JSON.parse(execSync(`gcloud container images list --repository=${targetFolder} --format=json`).toString());

    if (image.length) {
        image.map((nameList) => {
            imageFolderList.push(nameList.name);
        });
    } else {
        imageLists.push(targetFolder);
    }
}

console.log(imageLists);

불러온 이미지목록은 그 안에 여러 이미지 태그를 가지고 있을수 있습니다.
대부분 우리가 사용하지 않는 오래된 이미지 태그는 "latest"가 붙어있지 않은 이미지들입니다.

앞에서 불러온 이미지 목록을 이용하여 다음과 같이 tag목록을 불러올 수 있습니다.
여기서 중요한 부분중의 하나는 latest라는 tag를 가진 이미지는 제외하고, 나머지 이미지만 불러와야 합니다.

const imageTagLists = [];
for (let i = 0; i < imageLists.length; i++) {
    const imageNames = JSON.parse(execSync(`gcloud container images list-tags ${imageLists[i]} --format=json`).toString());

    imageNames.map((imageInfo) => {
        if (imageInfo.tags.indexOf("latest") == -1) {
            imageInfo.tags.map((tag) => {
                imageTagLists.push(`${imageLists[i]}:${tag}`);
            });
        }
    });
}

console.log(imageTagLists);

불러온 이미지:태그 목록을 활용하여, 삭제를 합니다.

for (let i = 0; i < imageTagLists.length; i++) {
    execSync(`gcloud container images delete ${imageTagLists[i]} --force-delete-tags --quiet`);
}

이와 같은 방법을 이용하면 Container Registry에 있는 오래된 이미지들을 정리할 수 있습니다.
우선 이번에 작업을 하게된 이유중의 하나는 Container Registry에서 Artifact Registry로 옮기기 위한 사전작업입니다.
자세한 이야기들을 추가적인 포스팅을 통해 진행할 예정입니다.

profile
차세대 생성형 AI 블로그 서비스 "두루미스"를 만들고 있는 개발자

0개의 댓글