Docker容器无法启动求助:Spring Boot应用容器持续重启无日志输出
排查Docker容器持续Restart且无日志输出的问题
看起来你遇到了容器启动失败且无法获取日志的棘手问题,我来帮你一步步定位原因:
1. 先关闭自动重启,固定容器状态
你的docker-compose.yml里设置了restart: always,这会导致容器启动失败后不断重启,无法稳定下来排查。先修改这个配置:
services: test-create-backend: restart: no # 替换掉always # 其他配置不变
然后重新部署:
docker-compose down && docker-compose up test-create-backend
这样容器启动失败后会停在exited状态,方便后续检查。
2. 修复网络配置的明显错误
我注意到你的docker-compose.yml里网络配置存在不一致:
- services里的容器都引用了
test-proxy网络 - 但networks段定义的网络键是
disip-proxy,虽然外部名字是test-proxy,但引用时需要用定义的键名
修改networks段,让键名和services里的引用一致:
networks: test-proxy: # 把disip-proxy改成test-proxy external: name: test-proxy
这个配置错误可能导致容器无法连接到指定网络,直接启动失败。
3. 单独验证镜像的可用性
容器启动失败可能是镜像本身有问题,先跳过docker-compose,直接用镜像启动:
# 先重新构建镜像(避免缓存问题) docker-compose build --no-cache test-create-backend # 手动启动容器,替换xxx为你的JASYPT_PWD值 docker run --rm -e JASYPT_PWD=xxx test-create-backend
如果这里还是没有输出,说明问题出在镜像内部,继续下一步。
4. 修改Dockerfile,让容器能进入排查
暂时修改Dockerfile的ENTRYPOINT,替换成shell,这样容器启动后会停在交互模式:
# 把原来的ENTRYPOINT注释掉,换成这个 ENTRYPOINT ["bash"]
重新构建并启动容器:
docker-compose build test-create-backend docker run --rm -it test-create-backend
现在你可以进入容器,执行以下检查:
- 检查jar包是否存在:
ls -l /home/app/app.jar - 尝试手动执行启动命令:
java -jar -Dspring.profiles.active=local -Djasypt.encryptor.password=xxx /home/app/app.jar,看有没有报错信息 - 检查java环境是否正常:
java -version
5. 验证环境变量传递是否正常
你的启动命令依赖JASYPT_PWD环境变量,确认这个变量是否正确传递到容器:
# 用docker run直接传递变量并打印 docker run --rm -e JASYPT_PWD=xxx test-create-backend echo $JASYPT_PWD
如果没有输出,说明变量传递有问题。你可以:
- 在宿主机先export变量:
export JASYPT_PWD=xxx,再执行docker-compose up - 或者在项目根目录创建
.env文件,写入JASYPT_PWD=xxx,docker-compose会自动加载
6. 检查卷挂载的权限问题
你挂载了宿主机的/home/ubuntu/tnc_logs到容器的/TnC/logs,如果容器没有该目录的读写权限,可能导致启动失败:
- 先临时注释掉volumes段,看容器能否启动:
# volumes: # - /home/ubuntu/tnc_logs:/TnC/logs - 如果能启动,说明是权限问题。修改宿主机目录权限:
sudo chmod 777 /home/ubuntu/tnc_logs,再挂载测试
7. 检查构建阶段的jar包是否正确生成
进入构建阶段的容器,验证maven打包是否成功:
docker run --rm -it -v $(pwd)/src:/usr/src/app/src -v $(pwd)/pom.xml:/usr/src/app/pom.xml maven:3.6.0-jdk-11-slim bash cd /usr/src/app mvn clean package -DskipTests ls -l target/
确认生成的jar包名字是否符合test*.jar的匹配规则,如果名字不对,Dockerfile里的COPY命令会失败,导致镜像里没有jar包。
按照这些步骤排查,应该能找到容器启动失败的原因。
内容的提问来源于stack exchange,提问作者Madhu Sudhan Reddy




