Skip to content

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로 진입점을 바꾼 후 디버깅 및 수정한다:

docker run --name ddrm-hotfix -it --entrypoint bash ddrm:0.0.9

관리자 권한이 필요하다면 root 사용자로 로그인:

docker run -u root --name ddrm-hotfix -it --entrypoint bash ddrm:0.0.9

vi 등으로 수정 완료 후 exit 로 종료.

-l플래그(마지막으로 생성된 컨테이너)로 명령으로 컨테이너 상태 확인:

docker ps -l

아마 "Existed" 상태일 것이다.

바로 커밋하면 안된다. inspect 명령으로 방금 실행한 컨테이너의 Entrypoint를 확인하면 bash 로 바뀐걸 확인할 수 있다.

docker inspect ddrm-hotfix | grep -A 2 Entrypoint

아마 다음과 같이 출력될 것이다:

            "Entrypoint": [
                "bash"
            ],

커밋시 --change옵션으로 Dockerfile에 넣는 원래 ENTRYPOINT로 복원한다.

docker commit --change='ENTRYPOINT ["python", "-OO", "-m", "ddrm"]' ddrm-hotfix ddrm:0.0.9-hotfix

만약 사용자를 root 로 로그인 했다면 바꼈을 가능성이 있다. 기존 이미지의 사용자를 확인하자: (Config > User 항목을 보면 된다)

docker inspect ddrm:0.0.9
docker commit --change='USER app' --change='ENTRYPOINT ["python", "-OO", "-m", "ddrm"]' ddrm-hotfix ddrm:0.0.9-hotfix

생성된 이미지를 확인하면 된다:

docker images

생성된 이미지의 Entrypoint를 확인해 보자:

docker inspect ddrm:0.0.9-hotfix | grep -A 5 Entrypoint

아마 다음과 같이 출력될 것이다:

            "Entrypoint": [
                "python",
                "-OO",
                "-m",
                "ddrm"
            ],

핫픽스 수정을 위해 만들어둔 컨테이너는 아직 존재한다.

docker ps -l

필요하다면 제거하자:

docker rm ddrm-hotfix

미심쩍다면 새로 만든 이미지 내부의 수정 내역을 확인해보자:

docker run --rm -it --entrypoint bash ddrm:0.0.9-hotfix

See also