【问题标题】:maven fail in spring project build trying to establish connection with databaseMaven 在 Spring 项目构建中失败,试图建立与数据库的连接
【发布时间】:2019-08-09 02:22:04
【问题描述】:

我为我的 spring 项目制作了一个 docker-compose 和 dockerfile,但它在 maven 构建阶段失败了,因为正在尝试与 postgres 服务建立连接,我不知道如何解决它。

这是我的 docker-compose 文件:

version: '3'
services:

  postgres:
    build:
      context: .
      dockerfile: docker/postgres/Dockerfile
    restart: always
    environment:
      POSTGRES_DB: ${postgres_database}
      POSTGRES_USER: ${postgres_username}
      POSTGRES_PASSWORD: ${postgres_password}
    ports:
      - '5432:5432'
    volumes:
      - ./pgdata:/var/lib/postgresql/data

  api:
    build:
      context: .
      dockerfile: docker/jdk/Dockerfile
    restart: always
    environment:
      postgres_database: ${postgres_database}
      postgres_username: ${postgres_username}
      postgres_password: ${postgres_password}
    ports:
      - '8100:8080'
    depends_on:
      - postgres

我的 postgres dockerfile:

FROM postgres:11-alpine

ENV POSTGRES_DB: ${POSTGRES_DB}
ENV POSTGRES_USER: ${POSTGRES_USER}
ENV POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

COPY ./docker/postgres/init.sql /docker-entrypoint-initdb.d

EXPOSE 5432

我在其中构建项目的 jdk dockerfile(失败)并运行 jar:

FROM maven:3.6.0-jdk-11-slim AS build

COPY ./src /usr/src/app/src
COPY ./pom.xml /usr/src/app

RUN mvn -f /usr/src/app/pom.xml clean package

FROM adoptopenjdk/openjdk11:jre11u-alpine-nightly

COPY --from=build /src/usr/src/app/target/logger_service-0.0.1-SNAPSHOT.jar /usr/src/app/app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/usr/app/app.jar"]

错误日志:

[ERROR] Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 14.844 s <<< FAILURE! - in cl.getcolors.loggerservice.LoggerServiceApplicationTests
[ERROR] contextLoads(cl.getcolors.loggerservice.LoggerServiceApplicationTests)  Time elapsed: 0.014 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
Caused by: org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution
Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
Caused by: java.net.UnknownHostException: postgres

我该如何解决?

【问题讨论】:

标签: java maven spring-boot docker


【解决方案1】:

我找到了解决方案,maven 尝试执行应用程序的测试,因此它根据配置执行对数据库的调用,这发生在 mvn clean package 命令中。 -DskipTests 必须在命令中添加指令才能运行maven no tests,这样才能正确构建。

mvn clean package -DskipTests

我的 dockerfile 现在看起来像这样并且可以完美运行:

FROM maven:3.6.0-jdk-11-slim AS build

COPY ./src /usr/src/app/src
COPY ./pom.xml /usr/src/app

RUN mvn -f /usr/src/app/pom.xml clean package -DskipTests

FROM adoptopenjdk/openjdk11:jre11u-alpine-nightly

COPY --from=build /src/usr/src/app/target/logger_service-0.0.1-SNAPSHOT.jar /usr/src/app/app.jar

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/usr/app/app.jar"]

【讨论】:

    【解决方案2】:

    除了上面的解释之外,必须注意的是,在构建映像时,不能访问数据库。只有创建容器后,程序才能访问数据库。

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2018-09-20
      • 1970-01-01
      • 2016-07-08
      • 2023-01-28
      • 2016-09-30
      相关资源
      最近更新 更多