You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动