Docker 실행 시, Entrypoint에서 exec 명령어를 사용하는 이유


오픈소스의 Dockerfile을 보면, 종종 Entrypoint로 쉘 스크립트를 지정하는 경우들을 볼 수 있습니다. 그 때마다 쉘 스크립트에 있던 exec 명령어를 봤는데, 그 역할에 대해서 이번에 처음 알게 되었습니다.


1. Docker는 컨테이너를 종료할 때, 1번 프로세스에 SIGTERM을 보내고, 만약 타임아웃이 발생하면 SIGKILL을 통해 강제 종료합니다. SIGKILL로 종료되면 137번 코드와 함께 Exit합니다.


2. Entrypoint로 쉘 스크립트를 지정하면, 쉘 스크립트가 컨테이너의 1번 프로세스가 됩니다. 즉, 시그널을 받는 첫 프로세스가 바로 쉘 스크립트가 된다는 의미입니다.


3. 쉘 스크립트는 백그라운드로 실행 시에, 자식 프로세스에 정상적으로 시그널을 전달하지 않습니다. 따라서 Docker가 컨테이너를 종료하기 위해 SIGTERM을 보내면, 쉘 스크립트만 종료되고, 자식 프로세스들은 정상적으로 종료되지 않을 수 있습니다. 그 상태에서 타임아웃이 발생하면, 결국 SIGKILL로 종료됩니다.


4. exec 명령어는 주로 유닉스 계열에서 사용하는 명령어인데, 해당 명령어는 현재 쉘 프로세스를 대체해줍니다. 즉, exec를 통해 특정 명령어를 수행하면 해당 명령어가 실행되고, 기존 쉘 스크립트는 종료됩니다.


5. Entrypoint로 지정한 쉘 스크립트에서 마지막에 프로그램 수행 시, exec 명령어를 수행하면, 해당 프로그램을 1번 프로세스로 만들 수 있습니다. 그러면 시그널도 프로그램이 직접 받을 수 있어서 Graceful Termination 과정을 커스텀하게 구현할 수 있습니다.


https://brunch.co.kr/@growthminder/142

Entrypoint에서 exec 사용하는 이유

Brunch Story

Entrypoint에서 exec 사용하는 이유

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 2일 오후 1:06

댓글 0

    함께 읽은 게시물

    고용노동부에서 주관하는 청년미래플러스 3기를 모집 중이라고 합니다.

    구직자와 재직자 두 가지 트랙을 동시에 모집한다고 하네요.

    • 모집 기간: 6월 15일 ~ 8월 3일

    ... 더 보기

    확장성 있는 시스템 설계하기

    ... 더 보기

    확장성 있는 시스템 설계하기 강의 | JYK 매니지먼트 - 인프런

    인프런

    확장성 있는 시스템 설계하기 강의 | JYK 매니지먼트 - 인프런

     • 

    저장 64 • 조회 3,869


    스프링 핵심 기능으로 통합된 Spring Retry

    S

    ... 더 보기

    스프링 핵심 기능으로 통합된 Spring Retry

    www.linkedin.com

    스프링 핵심 기능으로 통합된 Spring Retry

     • 

    저장 1 • 조회 411



    품질 높은 프로젝트는 어떻게 만들어질까? 🤔

    ... 더 보기

    “품질 높은 프로젝트는 어떻게 만들어질까?”

    F-Lab : 상위 1% 개발자들의 멘토링

    “품질 높은 프로젝트는 어떻게 만들어질까?”