在tomcat docker镜像中找不到JDBC驱动程序

cuxqih21  于 12个月前  发布在  Docker
关注(0)|答案(2)|浏览(230)

我有一个spring framework web应用程序,我正在尝试使用tomcat和docker image将其部署到生产环境中。
我搜索了这个错误,发现有两个可能的错误。第一个是不正确的数据库网址格式,我检查了我的,它是正确的。数据库网址是这样的

jdbc:postgresql://localhost:5432/postgres?currentSchema=volga&stringtype=unspecified

字符串
第二个可能的问题是Postgres db库文件不包含在war文件中。所以我在运行的tomcat容器中运行bash命令,检查Postgres库文件,它存在于war文件中。我还试图将Postgres库复制到tomcat lib文件夹中,但它不起作用。
我用最少的代码创建了一个repo来重现错误。https://github.com/ap30422/spring-boot.git
请克隆存储库并将目录更改为compete目录。运行mvn clean install package构建应用程序。然后运行Docker build .构建镜像。使用docker run #insert_image_id. -p 8080:8080运行Docker镜像
如果检查http://localhost:8080,您将在docker容器日志中看到Down文本和错误日志。

koaltpgm

koaltpgm1#

问题是,您正在非常努力地围绕Sping Boot 提供的所有东西工作。
1.你不使用自动配置的DataSource,而是尝试自己做一些事情。
1.您没有使用嵌入式Tomcat,而是尝试部署应用程序。
使用你所拥有的框架和工具来获得优势,而不是围绕事情工作。

使用Sping Boot DataSource

在您的application.properties(应该在src/main/resources中)中添加以下内容

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=volga&stringtype=unspecified
spring.datasource.username=ni
spring.datasource.password=ni

字符串
接下来,修改您的HelloController以使用DataSource或更好的JdbcTemplate

@RestController
public class HelloController {

  private final JdbcTemplate jdbc;

  public HelloController(JdbcTemplate jdbc) {
    this.jdbc=jdbc;
  }

  @GetMapping("/")
  public String index() {
  
    try {
      String hello = jdbc.queryForObject("select 'hello'", String.class);
      return "UP";
    } catch (DataAccessException dae) {
      return "DOWN";
    }
  }
}


现在您正确地使用了Sping Boot 配置的DataSource,Sping Boot 将加载正确的驱动程序(如果它在类路径上)。
应用程序可能无法启动,因为我怀疑在您为此应用程序构建的容器中是否有可用的PostgreSQL数据库。

使用嵌入式tomcat

Sping Boot 已经提供了Tomcat作为默认提供程序,并且应该用于运行它。将您的applicable更改为jar而不是war。并修改您的Dockerfile以启动应用程序而不是使用Tomcat并部署应用程序。

FROM eclipse-temurin:8-jre-alpine
ADD target/*.jar /app.jar

EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]


这将启动您创建的应用程序并使用嵌入式tomcat示例。

**注意:**这不是Sping Boot 应用程序的最佳Dockerfile,您希望使用更多层,以便能够重用。请参阅Spring Boot Docker Guide

u0njafvf

u0njafvf2#

您遇到的当前问题可能归因于缺少JDBC驱动程序或Sping Boot 应用程序或Tomcat Docker映像中的错误配置。您可以遵循以下几个步骤来解决并可能解决问题:

1.验证部门管理。

确认PostgreSQL JDBC驱动程序作为依赖项包含在pom.xml文件中。

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>your_postgresql_version</version>
</dependency>

字符串

2.检查Sping Boot 中的类路径。

虽然Sping Boot 应该自动将JDBC驱动程序加载到类路径中,但您可以在application.properties或application.yml文件中显式指定驱动程序类

spring.datasource.driver-class-name=org.postgresql.Driver

3.验证数据库连接URL

确保数据库连接URL正确。如果数据库位于不同的服务器上,请使用适当的主机名或IP地址。此外,请确认Tomcat可以解析“localhost”(如果该URL是“localhost”的一部分)。

4. Docker镜像构建

在创建Docker镜像时,请确保将PostgreSQL JDBC驱动程序复制到镜像中的正确位置。例如,您可以将其复制到“lib”文件夹。修改您的Dockerfile如下:

FROM tomcat:latest
COPY target/spring-boot.war /usr/local/tomcat/webapps/
COPY target/dependency/*.jar /usr/local/tomcat/lib/


通过遵循这些步骤,您应该能够解决与Sping Boot 应用程序和Tomcat Docker映像中的JDBC驱动程序和配置相关的潜在问题。

相关问题