Exit code는 컨테이너가 종료될 때, 종료에 대한 원인을 보고하기 위해 컨테이너 엔진에서 사용됩니다.
The most common exit codes used by containers are:
CODE # | NAME | WHAT IT MEANS |
---|---|---|
Exit Code 0 | Purposely stopped | Used by developers to indicate that the container was automatically stopped |
Exit Code 1 | Application error | Container was stopped due to application error or incorrect reference in the image specification |
Exit Code 125 | Container failed to run error | The docker run command did not execute successfully |
Exit Code 126 | Command invoke error | A command specified in the image specification could not be invoked |
Exit Code 127 | File or directory not found | File or directory specified in the image specification was not found |
Exit Code 128 | Invalid argument used on exit | Exit was triggered with an invalid exit code (valid codes are integers between 0-255) |
Exit Code 134 | Abnormal termination (SIGABRT) | The container aborted itself using the abort() function. |
Exit Code 137 | Immediate termination (https://komodor.com/learn/what-is-sigkill-signal-9-fast-termination-of-linux-containers/) | Container was immediately terminated by the operating system via SIGKILL signal |
Exit Code 139 | Segmentation fault (https://komodor.com/learn/sigsegv-segmentation-faults-signal-11-exit-code-139/) | Container attempted to access memory that was not assigned to it and was terminated |
Exit Code 143 | Graceful termination (https://komodor.com/learn/sigterm-signal-15-exit-code-143-linux-graceful-termination/) | Container received warning that it was about to be terminated, then terminated |
Exit Code 255 | Exit Status Out Of Range | Container exited, returning an exit code outside the acceptable range, meaning the cause of the error is not known |
컨테이너 failure 에 대해서 보다 깊이 이해하기 위해, 컨테이너의 수명 주기에 대해서 정리해보겠습니다.
컨테이너가 Exited 상태가 되었을때, 종료 코드를 확인하여 빠르게 원인을 파악할 수 있습니다.
해당 코드는 작업이 완료되고 나서 사용자에 의해 의도적으로 컨테이너가 중지 되었을때 트리거 됩니다.
종료 코드 1은 다음 중 하나의 사유로 인하여 컨테이너가 중지되었음을 나타냅니다.
Application error
어플리케이션 자체에 문제가 있는 경우 또는 런타임 환경에 에러가 있는 경우 발생할 수 있습니다.
잘못된 참조, An invaild reference
예를들어 어플리케이션에서 사용하조가 하는 파일이 컨테이너 이미지 안에 존재 하지 않는 경우 발생할 수 있습니다.
도커 명령어가 잘못 실행되어 수행이 실패했을때 발생합니다.
종료 코드 126은 컨테이너 specification에 명시된 명령을 호출 할 수 없음을 의미합니다.
이 에러는 컨테이너를 실행하는데 필요한 CI 스크립트 오류로 발생하거나, missing dependency 로 인해 발생합니다.
컨테이너의 사양에 지정된 명령이 존재하지 않는 파일이나 디렉토리를 참조할 경우 발생합니다.
실패한 컨테이너의 명령을 확인하고 이미지를 수정합니다.
컨테이너 내의 코드가 종료명령을 트리거 하여 종료 되었지만, 유효한 종료코드를 반환하지 않을 경우 발생합니다.
kill -9
종료 코드 137은 컨테이너가 호스트 운영 체제에서 SIGKILL 신호를 수신했음을 의미합니다.
이 신호는 유예 기간 없이 프로세스를 즉시 종료하도록 지시합니다.
다음 중 하나일 수 있습니다.
docker kill
명령을 사용할 때와 같이 컨테이너 엔진을 통해 컨테이너가 종료될 때 트리거됩니다.kill -9
명령을 보내는 Linux 사용자에 의해 트리거 됩니다.docker
명령은 inspectOOMKilled
오류를 나타냅니다.종료 코드 143은 컨테이너가 운영 체제로부터 컨테이너를 정상적으로 종료하도록 요청하는 SIGTERM 신호를 수신했으며 컨테이너가 정상적으로 종료되었음을 의미합니다(그렇지 않으면 종료 코드 137이 표시됨).
이 종료 코드는 다음과 같을 수 있습니다.
docker stop
또는 docker-compose down
명령을 사용할 때 컨테이너를 중지하는 컨테이너 엔진에 의해 트리거 됩니다.Terminating
상태로 트리거 된 Pod에 의해 발생합니다. 이 상태는 컨테이너가 정상적으로 종료될 수 있도록 30초의 기간을 제공합니다.컨테이너가 종료 코드 143으로 종료되면 어떻게 해야 합니까?
운영 체제가 SIGTERM 신호를 보낸 컨텍스트를 보려면 호스트 로그를 확인하십시오. Kubernetes를 사용하는 경우 kubelet 로그를 확인하여 포드가 종료되었는지 여부와 종료 시점을 확인하십시오.
일반적으로 종료 코드 143에는 문제 해결이 필요하지 않습니다. 이는 컨테이너가 호스트의 지시에 따라 적절하게 종료되었음을 의미합니다.
컨테이너 기반 인프라를 운영하면서, exit code에 따른 대처를 할 수 있습니다.
쿠버네티스에서는 kubectl describe pod [name]
명령을 이용하여 파드의 종료 코드를 확인할 수 있습니다.
$ kubectl describe pod [name]
Containers:
kubedns:
Container ID: ...
Image: ...
Image ID: ...
Ports: ...
Host Ports: ...
Args: ...
State: Running
Started: Fri, 15 Oct 2021 12:06:01 +0800
Last State: Terminated
Reason: Error
Exit Code: 255
Started: Fri, 15 Oct 2021 11:43:42 +0800
Finished: Fri, 15 Oct 2021 12:05:17 +0800
Ready: True
Restart Count: 1
Exit Code 0인 경우 - 컨테이너가 정상적으로 종료되었기 때문에 추가적인 조치를 취할 필요가 없습니다.
Exit Code 1~128 - 컨테이너 Spec에 누락된 부분이 있거나 잘못된 명령과 같은 내부 오류로 인해 종료되었으므로 컨테이너 이미지를 확인하여 문제를 해결합니다.
Exit Code 129~255 - SIGKILL 또는 SIGTERM과 같은 리눅스 명령어로 인해 종료되었으므로 노드와 같은 시스템을 점검합니다.