도커 컨테이너를 새로운 이미지로 평탄화하기

인공능지연구소·2024년 6월 7일

문제상황

이미지 A로 컨테이너를 만들고 그 컨테이너에서 여러가지 작업을 한 후 commit으로 이미지 B를 만들었다. 이런 경우 이미지 A는 이미지 B의 부모가 된다(레이어 구조). 따라서 이미지 A를 삭제하고 싶어도 이미지 B 때문에 삭제할 수 없다. 이미지 A에 대하여 더이상 관심이 없고 이미지 A와 B를 완벽하게 통합하고 싶다면 어떻게 해야하나?

해결방법

이러한 작업을 레이어 구조의 평탄화 작업이라고 한다.

  1. 기존 컨테이너 실행
docker run -it --name temp_container myimageB:v1
  1. 컨테이너 내부 파일 시스템을 tar로 저장
docker export temp_container -o myimageB_flattened.tar
  1. tar 파일을 새로운 이미지로 가져오기
# 방법1
cat myimageB_flattened.tar | docker import - myimageB_flattened:v1

# 방법2
cat ~/myimageB_flattened.tar | docker import --change "CMD [\"/bin/bash\"]" - myimageB_flattened:v1

방법 1을 사용할 경우 새로운 컨테이너를 만들 때 run을 사용할 수 없다.
아마 다음과 같은 에러가 발생할 것.

docker: Error response from daemon: No command specified.

이유는 export를 통하여 만들어진 이미지는 단순히 컨테이너의 파일시스템을 아카이빙해서 만든 이미지기 때문이다. 따라서 새로운 Dockerfile 작성 등을 해야 쓸 수 있는데,
방법 2를 사용하는 것도 해결책이 될 수 있다.
4. 기존 컨테이너 삭제

docker rm temp_container
  1. 기존 이미지 삭제
docker rmi myimageA:v1
docker rmi myimageB:v1
profile
내가 뭘 해봤는지는 시리즈 탭에 다 정리해뒀슈

0개의 댓글