Postgresql 使用spring boot和postgres正确设置docker compose

Postgresql 使用spring boot和postgres正确设置docker compose,postgresql,spring-boot,docker,maven,docker-compose,Postgresql,Spring Boot,Docker,Maven,Docker Compose,我有一个docker compose文件,其中有两个服务flamup服务用于构建我的spring boot应用程序,并链接到由db服务定义的postgres映像 这是docker-compose.yml文件 version: '3.8' volumes: postgres_data: services: flamup: build: . container_name: flamup environment: - DB_SERVER=db

我有一个docker compose文件,其中有两个服务
flamup
服务用于构建我的spring boot应用程序,并链接到由
db
服务定义的postgres映像

这是docker-compose.yml文件

version: '3.8'


volumes:
  postgres_data:

services:

  flamup:
    build: .
    container_name: flamup
    environment:
      - DB_SERVER=db
      - POSTGRES_DB=flamup
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    ports:
      - "8080:8080" # Forward the exposed port 8080 on the container to port 8080 on the host machine
    depends_on:
      - db
    links:
      - db



  db:
    image: "postgres:9.6-alpine"
    container_name: postgres_container
    restart: always

    volumes:
      - postgres_data:/var/lib/postgresql/data

    ports:
      - "5432:5432"

    environment:
      - POSTGRES_DB=flamup
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - PGDATA=/var/lib/postgresql/data/pgdata
下面是spring boot应用程序的Dockerfile

FROM maven:3.6.1-jdk-8-slim AS build
RUN mkdir -p workspace
WORKDIR workspace
COPY pom.xml /workspace
COPY src /workspace/src
COPY frontend /workspace/frontend
COPY data2.csv /workspace
RUN mvn -f pom.xml clean package
#RUN ./mvnw clean package -DskipTests

#FROM adoptopenjdk/openjdk11:alpine-jre
FROM openjdk:8-alpine
COPY --from=build /workspace/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]
我正在使用用于将前端与spring boot应用程序一起引导。当地一切正常

然而,当我试图通过docker compose运行它时,我在application-properties.yml中做了一些更改

server:
  error:
    include-message: always
    include-binding-errors: always


spring:
  datasource:
    url : jdbc:postgresql://${DB_SERVER}/${POSTGRES_DB}
    username : ${POSTGRES_USER}
    password : ${POSTGRES_PASSWORD}

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        dialect: org.hibernate.dialect.PostgreSQLDialect
        format_sql: true
        jdbc:
          lob:
            non_contextual_creation: true
    show-sql: true

  session:
    store-type: jdbc
    jdbc:
      table-name: SPRING_SESSION
      initialize-schema: never
然而,由于这个原因,每次构建get都会失败

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: ${DB_SERVER}
我尝试过的事情

  • 硬编码
    DB\u服务器
    变量并替换为
    localhost:5432
    DB
    DB:5432
    。这些方法似乎都不管用
  • 添加取决于
    flamup
    服务中的字段
  • 在两个服务中添加networks字段并通过网桥连接它们
  • 尝试了不同版本的postgres和maven

似乎没有什么是解决方案,任何帮助都将受到高度赞赏。

因此,一个有效的问题解决方案(尽管可能没有那么有效)是通过跳过测试来运行maven构建。显然,hibernate导致运行JPA语句,这导致JDBCPostgres异常失败,因为还没有运行postgres容器

从而将dockerfile更改为

RUN mvn -f pom.xml clean install -DskipTests=true
而不是

RUN mvn -f pom.xml clean package
导致成功创建可以作为docker容器运行的jar文件