Entrypoint에서 exec 사용하는 이유
Brunch Story
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
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 6월 2일 오후 1:06
C
... 더 보기이
... 더 보기🗞️ 간밤에 구글이 Gemini 2.5 Pro를 출시했는데요. 벤치마크 상으로는 GPT-4.5와 Claude 3.7 의 성능을 크게 뛰어넘는 결과를 보여줍니다. 특히 코딩능력이 매우 크게 향상되었는데요.
... 더 보기