[英]Connecting PostgreSQL database to Spring application (both running in docker) Connection refused
[英]Spring Boot, PostgreSQL, and Docker - Connection Refused whil Running in Container
我正在尝试构建一个由 Spring Boot 应用程序和 PostgreSQL 数据库组成的“服务”。 当 Spring Boot 应用程序在我的本地机器上运行时,我已经能够从 Spring Boot 应用程序访问数据库(在容器中运行)。 现在,当我尝试将 Spring Boot 应用程序移动到容器时,收到以下错误:
inventory_1 | 2018-01-20 18:43:06.108 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection] with root cause
inventory_1 |
inventory_1 | java.net.ConnectException: Connection refused (Connection refused)
但是,我可以从我的本地机器连接到数据库: psql -h localhost -p 5000 -U kelly_psql -d leisurely_diversion
我的 application.properties 文件:
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=false
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc:postgresql://localhost:5432/leisurely_diversion
spring.datasource.username=kelly_psql
spring.datasource.password=pass
spring.datasource.driver-class-name=org.postgresql.Driver
我的 docker-compose 文件:
# Use postgres/example user/password credentials
version: '3.2'
services:
db:
image: postgres
ports:
- 5000:5432
environment:
POSTGRES_PASSWORD: example
volumes:
- type: volume
source: psql_data
target: /var/lib/postgresql/data
networks:
- app
restart: always
inventory:
image: kellymarchewa/inventory_api
depends_on:
- db
ports:
- 8080:8080
networks:
- app
restart: always
volumes:
psql_data:
networks:
app:
我的 Dockerfile(来自Spring 网站)
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
我怀疑问题在于对 Docker 或容器的误解(就我而言),但我不确定。 任何建议将不胜感激。
您将应用程序指向localhost
,但这不在容器之间共享。
要访问另一个容器,您必须引用其hostname
。
在您的情况下,我了解您希望inventory
服务访问db
服务。 所以你应该使用以下datasource
网址:
spring.datasource.url=jdbc:postgresql://db:5432/leisurely_diversion
请参阅有关使用 docker compose 从另一个容器连接到容器的简单教程: https : //docs.docker.com/compose/gettingstarted/
就像在我的情况下,如果您使用的是 Windows 8.1 的Docker Toolbox ,那么您不能使用“localhost”,
相反,您必须使用 docker machine ip;
host> docker-machine ip default
192.168.99.100
之后,您的网址将如下所示;
spring.datasource.url=jdbc:postgresql://192.168.99.100:5432/bankdb
这将成功连接到 docker Postgres DB。
干杯!!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.