개발 환경에서 호스트 경로에 소스 코드를 두고 컨테이너 볼륨으로 지정했다.

컨테이너를 올린 후 코드 수정을 해서

commit하고 save하고 load했더니 수정된 코드가 반영이 안됐다.

 

= 볼륨 데이터는 commit에 포함되지 않음!

 


Docker 컨테이너의 파일 시스템 구조

 

▶︎ 이미지 레이어

여러 개의 읽기 전용 레이어들이 쌓여 있는 구조

각각의 레이어는 Dockerfile의 명령어 (FROM, RUN, COPY 등)를 실행하면서 만들어짐

컨테이너를 만들면 이 이미지 위에 쓰기 가능한 컨테이너 레이어가 하나 얹혀짐

 

▶︎ 컨테이너 레이어

컨테이너 실행 중에 생기는 수정, 생성, 삭제된 모든 파일/디렉터리가 저장됨

단, 마운트된 경로는 제외!

> 해당 경로는 애초에 호스트 외부를 바라보도록 리디렉션되어 있음

그래서 볼륨 데이터는 이미지에도 컨테이너 레이어에도 없음

 

docker commit

docker commit은 컨테이너 레이어(=컨테이너 자체의 파일 시스템)만 저장

따라서 마운트된 경로는 커밋 대상이 아님

 


마운트된 데이터도 포함시키려면?

docker commit으로는 불가능

1. 마운트 경로 → 임시 경로 → commit → 복원

[전제 조건]
# 호스트 경로: /myproject
# 마운트: /myproject ↔ 컨테이너 내 /app/core
docker run -v /myproject:/app/core -it ubuntu bash

[1] 최초 컨테이너 /app/core → (호스트에 마운트됨)
                           /app/temp → (비어 있음, commit 반영을 위해 임시 폴더 만들기)

[2] 파일 수정
      /app/core/main.py ← 수정됨 (호스트에 반영됨)

[3] /app/temp에 복사
      /app/temp/main.py ← 복사됨 (컨테이너 내부에 존재)

[4] docker commit → temp만 이미지에 포함됨

[5] 새 컨테이너 실행 후 복원 cp /app/temp/* /app/core/

 

2. Dockerfile에서 COPY를 통한 이미지 재생성

FROM ubuntu
COPY ./core /app/core

 

'Docker & Kubernetes > [Docker]' 카테고리의 다른 글

[Docker] 서버에 Dockerfile 생성 후 배포  (0) 2023.06.01