TL;DR — 반입 아카이브가 원본보다 1.76~3.37배로 불고, 아카이브 digest가 레지스트리 digest와 달라 무결성 대조가 항상 실패했다. 압축과 digest를 그대로 보존하는 OCI 아카이브로 바꾸고, 원본 형식 유지·인덱스 통째 보존 옵션을 함께 주어 해결했다.
배경
프로젝트/기능: DeployHub — 이미지를 모아 반입용 단일 파일로 만드는 수집 단계
환경: skopeo, OCI 아카이브
설계 기준: 반입물은 사내에서 검증한 것과 digest 단위로 동일해야 한다
문제 (증상)
산출물 크기가 원본 대비 1.76~3.37배로 불어난다 — 폐쇄망 반입은 물리적으로 옮기므로 용량이 그대로 비용이다
아카이브를 다시 열어 digest를 대조하면 항상 불일치로 나온다 — 무결성 검사가 사실상 쓸모가 없다
원인 분석
두 가지가 겹쳐 있었다.
압축 손실 — 처음 쓴 아카이브 포맷은 레이어를 풀어서 담는다. 레지스트리에서는 압축된 채로 있던 것이 풀려서 저장되므로 크기가 불어난다
인덱스 평탄화 — 멀티아키텍처 인덱스를 플랫폼 하나로 골라 담으면, 아카이브가 가리키는 대상이 바뀌어 digest가 원본 인덱스와 달라진다
즉 전송 계층이 원본을 변형하고 있었다. 그러면 "같은 이미지"의 기준이 깨진다.
해결
압축과 digest를 보존하는 OCI 아카이브로 전환
원본 형식을 유지하는 옵션을 주어 schema2·OCI 인덱스 양쪽을 그대로 담게 했다
인덱스를 통째로 보존하는 옵션을 추가해 평탄화를 막았다
포맷을 특정 버전으로 강제하면 안 된다는 것도 확인했다 — 빌드 어테스테이션이 붙은 이미지에서 알 수 없는 미디어 타입으로 죽는다. 강제를 걷어내고 원본 유지로 대체했다
무결성 검사는 서로 다른 두 질문이라 나눠 다뤄야 한다고 정리했다 — ① 받는 도중 원본이 바뀌었나(수집 전·후 매니페스트 재조회 비교) ② 아카이브가 충실한 복사본인가(복사 도구가 blob마다 검증하므로 이미 담보됨)