Docker:Commit
docker commit: 종료된 컨테이너도 되살려주는 명령어
docker exec 명령어에는 한 가지 치명적인 문제가 있습니다. 바로 컨테이너가 실행중인 상태에서만 컨테이너 환경에 접근할 수 있다는 점입니다. 안타깝게도 시스템 관리자에게는 살아있는 컨테이너의 실행환경을 탐색하는 경우보다, 죽어있는 컨테이너의 상태를 부검하는 일이 더 중요합니다. 그리고 내부적인 문제로 죽은 컨테이너는 restart로 재실행하더라도 바로 죽어버리는 경우가 많습니다. 따라서 죽어있는 컨테이너에 한해서는 exec 명령어가 무용지물입니다.
이럴 때 고려해볼 수 있는 방법이 docker commit입니다. commit은 컨테이너의 특정 상태를 그대로 이미지로 만들어주는 명령어입니다. 이 명령어는 도커 빌드 과정에서 사용됩니다만, 일반적으로 직접 사용할 일은 거의 없습니다. 이미지 빌드 원리와 commit에 대한 더 자세한 내용은 다음 글을 참고해주세요.
만들면서 이해하는 도커(Docker) 이미지: 도커 이미지 빌드 원리와 OverlayFS
Options
-
--change
- The
--change
option will apply Dockerfile instructions to the image that is created. - Supported Dockerfile instructions -
CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR
종료된 컨테이너를 통해 핫픽스 이미지를 만드는 방법
다음과 같이 bash로 진입점을 바꾼 후 디버깅 및 수정한다:
관리자 권한이 필요하다면 root 사용자로 로그인:
vi 등으로 수정 완료 후 exit
로 종료.
-l
플래그(마지막으로 생성된 컨테이너)로 명령으로 컨테이너 상태 확인:
아마 "Existed" 상태일 것이다.
바로 커밋하면 안된다. inspect 명령으로 방금 실행한 컨테이너의 Entrypoint
를 확인하면 bash 로 바뀐걸 확인할 수 있다.
아마 다음과 같이 출력될 것이다:
커밋시 --change
옵션으로 Dockerfile에 넣는 원래 ENTRYPOINT
로 복원한다.
만약 사용자를 root 로 로그인 했다면 바꼈을 가능성이 있다. 기존 이미지의 사용자를 확인하자: (Config > User
항목을 보면 된다)
docker commit --change='USER app' --change='ENTRYPOINT ["python", "-OO", "-m", "ddrm"]' ddrm-hotfix ddrm:0.0.9-hotfix
생성된 이미지를 확인하면 된다:
생성된 이미지의 Entrypoint
를 확인해 보자:
아마 다음과 같이 출력될 것이다:
핫픽스 수정을 위해 만들어둔 컨테이너는 아직 존재한다.
필요하다면 제거하자:
미심쩍다면 새로 만든 이미지 내부의 수정 내역을 확인해보자: