You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:14:54