Postgresql 使用spring boot和postgres正确设置docker compose
我有一个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
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文件