了解Docker容器的常见退出状态码及其含义
了解Docker容器退出状态码可以帮助我们:
- 快速定位问题:通过状态码快速判断容器的退出原因,如命令权限不足(126)、命令未找到(127)等。
- 优化容器配置:根据状态码调整资源分配或优化代码,如内存不足导致的终止(137)。
- 提高故障排查效率:通过状态码判断容器是否因信号终止(如137、143),从而更有效地调试。
- 增强系统稳定性:通过监控状态码及时发现潜在问题,提高系统的稳定性和可靠性。
- 提升自动化部署和监控能力:在CI/CD和监控系统中,利用状态码作为判断依据,确保容器的正常运行。
-
状态码介绍
状态码 含义 0 容器运行一个简单的脚本并成功完成 1 容器运行的Python脚本存在语法错误 125 docker run命令未成功执行 126 容器中的命令无法被调用,如命令权限不足 127 容器中的命令未找到,如命令路径错误或拼写错误 137 容器被手动终止或因内存不足被系统终止 139 容器尝试访问未分配给它的内存 143 容器被手动终止,如使用docker stop命令 255 容器退出时返回的退出码超出有效范围 -
复现这些状态码
2.1. 容器内进程运行成功后退出返回 0
[root@kvm-server ~]# docker run --name test ubuntu echo success success [root@kvm-server ~]# docker inspect --format='{{.State.ExitCode}}' test 0
2.2. 容器运行的Python脚本存在语法错误 退出返回 1
准备一个python脚本# cat app.py import os # 尝试读取一个必需的环境变量 database_url = os.environ['DATABASE_URL'] print(f"Connecting to database: {database_url}") print("Application running...")
[root@kvm-server ExitCode]# docker run --name test -v $PWD/app.py:/app.py python:3.9-slim python app.py Traceback (most recent call last): File "//app.py", line 4, in <module> database_url = os.environ['DATABASE_URL'] File "/usr/local/lib/python3.9/os.py", line 679, in __getitem__ raise KeyError(key) from None KeyError: 'DATABASE_URL' [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 1
shell脚本语法问题的退出码是 2
# cat test.sh #!/bin/bash if true; then echo success if
[root@kvm-server ExitCode]# docker run --name test -v $PWD/test.sh:/test.sh ubuntu bash /test.sh /test.sh: line 6: syntax error: unexpected end of file [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 2
2.3. docker run命令未成功执行返回 125
[root@kvm-server ExitCode]# docker run --neme test ubuntu echo ; echo $? unknown flag: --neme See 'docker run --help'. 125
2.4. 容器中的命令无法被调用,如命令权限不足 返回 126
如下,当前脚本无执行权限,容器中使用 . 执行脚本。
[root@kvm-server ExitCode]# ll test.sh
-rw-r–r-- 1 root root 44 Apr 3 01:13 test.sh# docker run --name test -v $PWD/test.sh:/test.sh ubuntu ./test.sh docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "./test.sh": permission denied: unknown. [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 126
2.5. 容器中的命令未找到,如命令路径错误或拼写错误 返回 127
[root@kvm-server ExitCode]# docker run --name test ubuntu ech succes docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "ech": executable file not found in $PATH: unknown. [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 127
2.6. 容器被手动终止或因内存不足被系统终止 返回 137
被手动kill情况
[root@kvm-server ExitCode]# docker run -itd --name test ubuntu bash dbf8a5126e6a9a52529f20d2cc72b9d4f03026c61f8e53549c4f13b32703ed5a [root@kvm-server ExitCode]# docker kill test test [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 137
2.7. 容器被手动终止,如使用docker stop命令 返回 143
即像容器发送 SIGTERM 信号,如果程序无法处理SIGTERM 则等待10秒后会被SIGKILL 掉,并返回137。
编写一个脚本,用于捕获SIGTERM,退出并返回 143代码。
# cat test.sh #!/bin/bash trap 'echo "SIGTERM received, exiting..." ; exit 143' SIGTERM while true; do sleep 1 done
[root@kvm-server ExitCode]# docker run -d --name test -v $PWD/test.sh:/test.sh ubuntu bash /test.sh a216af36992cc276b1e05f94681bb3e44a56be82f2b65a2b06f1a8e1944c45b1 [root@kvm-server ExitCode]# docker stop test test [root@kvm-server ExitCode]# docker inspect --format='{{.State.ExitCode}}' test 143