Tomcat 服务器未在 docker 中的 Spring Boot Web 应用程序中启动

问题描述 投票:0回答:1

问题描述: 我在尝试在 Docker 容器中使用 PostgreSQL 运行 Spring Boot Web 应用程序时遇到困难。主要问题是嵌入式 Tomcat 服务器未按预期启动。奇怪的是,Docker 容器退出时状态代码为 0,这表明主进程(Spring Boot 应用程序)已成功结束或意外终止。

采取的故障排除步骤:

我仔细检查了 Spring Boot 应用程序生成的日志,以识别可能揭示 Tomcat 无法启动原因的任何错误消息或异常。

容器退出后,我使用 docker log 命令检查了其日志。我的目标是寻找任何可能解释提前终止的异常行为或错误消息。

我重新访问了 Dockerfile 和 Docker Compose 配置,以确保它们已正确设置以运行 Spring Boot 应用程序。这涉及检查依赖关系、入口点规范和其他相关配置。

确认我的 Spring Boot 应用程序可以成功建立与 PostgreSQL 数据库的连接至关重要。我仔细检查了 application.properties 或 application.yml 文件中指定的数据库 URL、凭据和驱动程序类配置。

为了防止容器过早关闭,我探索了在应用程序中实施运行状况检查的选项。这涉及在容器被视为准备就绪之前确保应用程序处于健康状态。

考虑到最近的代码更改可能引入了该问题,我考虑回滚到已知的工作状态并逐渐重新引入更改以查明问题的根源。 请求帮助: 我正在寻求帮助,以了解为什么 Tomcat 无法在我的 Docker 容器中启动以及为什么容器以状态代码 0 退出。如果有人遇到类似问题或对 Docker 中的 Spring Boot 应用程序故障排除有深入了解,我会非常感谢您的指导。 构建.gradle:

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}
bootJar{
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
apply plugin: 'java'

springBoot {
    mainClass = 'com.example.fcs.FeedbackCollectionSystemApplication'
    buildInfo()
}
jar {
    manifest {
        attributes 'Main-Class': 'com.example.fcs.FeedbackCollectionSystemApplication'
    }

    archiveFileName = 'app.jar'
    
    destinationDirectory.set(file('src/main/docker'))

    from {
        configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-jdbc'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-tomcat'
    implementation 'org.postgresql:postgresql'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

docker-compose 文件:

version: '3.8'

services:
  postgres:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: 11111111Aa
      POSTGRES_DB: feedback
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

  app:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - postgres
    environment:
      SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/feedback
      SPRING_DATASOURCE_USERNAME: postgres
      SPRING_DATASOURCE_PASSWORD: 11111111Aa

volumes:
  postgres-data:

Dockerfile:

FROM openjdk:19
VOLUME /tmp
EXPOSE 8080
ARG JAR_FILE=/*.jar
ADD ${JAR_FILE} app.jar
CMD ["java","-jar","/app.jar"]
#or entrypoint idk

主课:

package com.example.fcs;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FeedbackCollectionSystemApplication {

    public static void main(String[] args) {
            SpringApplication.run(FeedbackCollectionSystemApplication.class, args);
    }

}

日志:

app-1       |  :: Spring Boot ::                (v3.2.0)
app-1       |
app-1       | 16:48:21.928 [main] INFO com.example.fcs.FeedbackCollectionSystemApplication -- Starting FeedbackCollectionSystemApplication using Java 19 with PID 1 (/app.jar started by root in /)
app-1       | 16:48:21.941 [main] INFO com.example.fcs.FeedbackCollectionSystemApplication -- No active profile set, falling back to 1 default profile: "default"
app-1       | 16:48:22.942 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate -- Bootstrapping Spring Data JPA repositories in DEFAULT mode.
app-1       | 16:48:23.022 [main] INFO org.springframework.data.repository.config.RepositoryConfigurationDelegate -- Finished Spring Data repository scanning in 70 ms. Found 2 JPA repository interfaces.
app-1       | 16:48:23.484 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Starting...
app-1       | 16:48:23.722 [main] INFO com.zaxxer.hikari.pool.HikariPool -- HikariPool-1 - Added connection org.postgresql.jdbc.PgConnection@4a34e9f
app-1       | 16:48:23.724 [main] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Start completed.
app-1       | 16:48:23.778 [main] INFO org.hibernate.jpa.internal.util.LogHelper -- HHH000204: Processing PersistenceUnitInfo [name: default]
app-1       | 16:48:23.851 [main] INFO org.hibernate.Version -- HHH000412: Hibernate ORM core version [WORKING]
app-1       | 16:48:23.900 [main] INFO org.hibernate.cache.internal.RegionFactoryInitiator -- HHH000026: Second-level cache disabled
app-1       | 16:48:24.136 [main] INFO org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo -- No LoadTimeWeaver setup: ignoring JPA class transformer
app-1       | 16:48:25.238 [main] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator -- HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
app-1       | 16:48:25.243 [main] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean -- Initialized JPA EntityManagerFactory for persistence unit 'default'        
app-1       | 16:48:25.918 [main] INFO com.example.fcs.FeedbackCollectionSystemApplication -- Started FeedbackCollectionSystemApplication in 4.361 seconds (process running for 4.706)
app-1       | 16:48:25.926 [SpringApplicationShutdownHook] INFO org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean -- Closing JPA EntityManagerFactory for persistence unit 'default'
app-1       | 16:48:25.930 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Shutdown initiated...
app-1       | 16:48:25.936 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource -- HikariPool-1 - Shutdown completed.
app-1 exited with code 0

也许我必须将 tomcat 作为单独的容器运行,请帮忙!

java spring spring-boot docker tomcat
1个回答
0
投票

当您没有指定depends_on并进行适当的健康检查时,docker-compose将同时启动这两个服务。 Postgres 容器可能需要更多时间才能访问。

一个快速修复方法可能是向您的应用程序添加一个

restart: always
,然后它会在崩溃几次后重新启动,直到 Postgres 容器允许应用程序成功与其连接。

app:
    restart: always
© www.soinside.com 2019 - 2024. All rights reserved.