我有一个使用DB的spring boot应用程序,我定义了
docker-compose
it的文件:
services:
my-app:
build: .
ports:
- "8080:8080"
environment:
DB_HOST: app-db
DB_PORT: 5434
DB_USER: myuser
DB_PASSWORD: mypassword
DB_NAME: mydb
depends_on:
- db
container_name: my-app
db:
image: postgres:13-alpine
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
volumes:
- production_data:/var/lib/postgresql/data
- ./db/create_script.sql:/docker-entrypoint-initdb.d/create_script.sql
ports:
- "5434:5432"
container_name: app-db
volumes:
production_data:
以及application.properties:
# Database connection
spring.datasource.url=jdbc:postgresql://${DB_HOST}:${DB_PORT}/${DB_NAME}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
然而,当我运行docker compose时
my-app
容器因以下错误而失败:
> HHH000342: Could not obtain connection to query metadata
> java.lang.NullPointerException: Cannot invoke "org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(java.sql.SQLException,
> String)" because the return value of
> "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcIsolationDelegate.sqlExceptionHelper()"
> is null
这几乎意味着,如果你从中省略我的应用程序,它就无法连接到数据库
docker编写
文件,然后从中启动数据库,它就可以工作了(将DB_HOST更改为localhost)。
这是什么原因造成的?因为它们是在docker compose中定义的,所以它们应该在同一个网络中(通过检查容器,它们确实在docker composer创建的同一网络中)
谢谢你的帮助!