如何进入启动后立即退出的Docker容器获取Shell排查问题
启动即退出的Docker容器排查方法
docker exec 仅能对处于运行状态的容器生效,容器启动后立即退出时进程已经终止,自然无法通过该命令切入终端,可按以下优先级排查:
- 优先查看容器日志
无论容器是否运行,都可以通过日志命令拉取启动过程的输出,80%以上的启动报错会直接打印在日志中:# 查看对应容器全量日志 docker logs <容器名或容器ID> # 仅查看最后100行日志,避免日志过多刷屏 docker logs --tail 100 <容器名或容器ID> # 追加时间戳参数,方便定位报错时间点 docker logs -t --tail 100 <容器名或容器ID> - 通过退出码缩小问题范围
如果日志没有输出有效信息,可以先查询容器的退出状态码,快速定位问题大类:
常见退出码对应问题:docker inspect <容器名或容器ID> --format='{{.State.ExitCode}}'0:容器正常执行完启动命令后主动退出,一般是启动命令没有配置常驻前台进程,比如启动nginx没加-g 'daemon off;'参数1:应用自身启动报错,常见原因是配置文件格式错误、依赖缺失、文件权限不足125:Docker daemon执行启动逻辑出错,常见原因是端口映射冲突、挂载目录不存在、镜像拉取失败126:容器内指定的启动命令无法执行,常见原因是命令没有可执行权限、指定路径是目录不是文件127:容器内找不到指定的启动命令,常见原因是命令拼写错误、依赖的二进制文件未打包进镜像137:容器被强制终止,常见原因是内存不足触发OOM被系统杀掉、收到手动kill信号
- 需要进入容器内部排查时的操作
已退出的容器无法直接exec进入,最便捷的方式是用原镜像、携带原容器的所有启动参数(端口映射、目录挂载、环境变量等),临时覆盖启动入口为常驻shell,即可进入交互终端手动执行原启动命令复现问题:
进入终端后,手动执行原本的容器启动命令,就能直接看到实时报错输出,也可以逐一检查容器内的配置文件、目录结构、权限设置是否符合预期。# 如果镜像内没有bash,可以换成/bin/sh docker run --rm -it --entrypoint /bin/bash <原容器使用的镜像名>
如果需要直接查看已退出容器内的文件,不需要启动新容器,可以直接把退出容器的文件系统导出:
解压导出的tar包即可完整查看容器内的所有文件内容。docker export <已退出的容器ID> > container_files.tar - docker-compose场景的快速排查技巧
临时修改对应服务的配置,增加tty: true配置,将启动命令改为sleep infinity,再执行docker-compose up <服务名>启动,容器就会保持常驻状态,此时直接用docker exec切入容器排查即可。
内容的提问来源于stack exchange,提问作者zaadeh
相关产品推荐
相关产品推荐

