Spring Boot应用在Docker中启动后立即停止的问题求助
Spring Boot Docker容器启动后立即停止的排查与解决
问题描述
将Maven构建的Spring Boot应用部署到Docker后,容器启动日志显示应用已启动,但随即停止,docker ps无运行中的容器。本地IDEA运行代码一切正常,相关配置及日志如下:
Dockerfile
FROM maven AS build COPY . . RUN mvn clean package -DskipTests FROM openjdk:21 COPY --from=build /target/javaapp.jar javaapp.jar EXPOSE 8080 ENTRYPOINT ["java","--enable-preview","-jar","javaapp.jar"]
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>javaProject</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.23</version> </dependency> <dependency> <groupId>nz.net.ultraq.thymeleaf</groupId> <artifactId>thymeleaf-layout-dialect</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.16.1</version> </dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-controls</artifactId> <version>21.0.2</version> </dependency> <dependency> <groupId>org.openjfx</groupId> <artifactId>javafx-web</artifactId> <version>21.0.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>RELEASE</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>javaapp</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>21</release> <compilerArgs>--enable-preview</compilerArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.javaapp.Application</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
容器启动日志
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.2.2) 18:36:51.387 [main] INFO com.example.javaapp.Application -- Starting Application using Java 21 with PID 1 (/javaapp.jar started by root in /) 18:36:51.392 [main] INFO com.example.javaapp.Application -- No active profile set, falling back to 1 default profile: "default" 18:36:52.143 [main] INFO com.example.javaapp.Application -- Started Application in 1.038 seconds (process running for 1.453
排查与解决步骤
1. 获取完整容器日志
当前提供的日志被截断,无法看到应用退出的具体原因。执行以下命令查看最后启动容器的完整日志:
docker logs $(docker ps -q -l)
日志末尾通常会包含异常堆栈或退出原因,比如数据库连接失败、依赖冲突、缺少图形环境等。
2. 清理不必要的依赖
- 移除*
javax.servlet-api*依赖:spring-boot-starter-web已经内置了适配Spring Boot的Servlet API,单独引入旧版本会导致依赖冲突,影响Web容器启动。 - 移除*
spring-boot-devtools*依赖:该依赖仅用于开发环境热部署,生产镜像中保留会触发非预期的应用退出逻辑。如果需要保留,需设置<scope>runtime</scope>并禁用自动重启。 - 移除JavaFX相关依赖(
javafx-controls、javafx-web):如果这是一个Web应用,这些依赖完全不必要。Docker容器默认没有图形环境,JavaFX初始化失败会直接导致应用退出。
3. 替换打包插件为Spring Boot官方插件
maven-shade-plugin并非Spring Boot应用的最优选择,官方的spring-boot-maven-plugin会自动处理依赖打包、启动类配置等问题,避免冲突。修改pom.xml中的插件配置:
<build> <finalName>javaapp</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <release>21</release> <compilerArgs>--enable-preview</compilerArgs> </configuration> </plugin> <!-- 替换为Spring Boot官方插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.2</version> <configuration> <mainClass>com.example.javaapp.Application</mainClass> <jvmArguments>--enable-preview</jvmArguments> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
4. 重新构建并运行
执行以下命令重新打包应用、构建镜像并运行容器:
# 重新打包 mvn clean package -DskipTests # 构建Docker镜像(假设镜像名为javaapp) docker build -t javaapp . # 运行容器,映射端口并查看实时日志 docker run -p 8080:8080 javaapp
如果应用仍有问题,根据完整日志中的错误信息进一步排查,比如数据库连接配置是否正确、环境变量是否缺失等。
内容的提问来源于stack exchange,提问作者Kastet6398
相关产品推荐
相关产品推荐

