问题描述
我正在尝试构建一个由Spring Boot应用程序和PostgreSQL数据库组成的服务。当Spring Boot应用程序在本地计算机上运行时,我已经能够从Spring Boot应用程序访问数据库(在容器中运行)。现在,当我尝试将Spring Boot应用程序移动到容器时,收到以下错误:
I am attempting to build a "service" consisting of a Spring Boot application and PostgreSQL database. I have been able to access the database (running in a container) from the Spring Boot app while the Spring Boot application was running on my local machine. Now, when I attempt to move the Spring Boot application to a container, I am received the following error:
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
However, I am able to connect to DB from my local machine:psql -h localhost -p 5000 -U kelly_psql -d leisurely_diversion
我的application.properties文件:
My application.properties file:
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文件:
My docker-compose file:
# 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(来自)
My Dockerfile (from the Spring website)
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或容器的误解(对我而言),但我不确定。任何建议将不胜感激。
I suspect the issue lies in a misunderstanding (on my part) of Docker or containers, but I am not sure. Any advice would be appreciated.
推荐答案
您正在将应用程序指向 localhost
,但不会在容器之间共享。
You are pointing your application towards localhost
, but this is not shared between containers.
要访问另一个容器,您必须引用其主机名
。
To access another container you have to refer to its hostname
.
对于您而言,我了解到您希望库存
服务访问 db
服务。因此,您应该使用以下 datasource
网址:
In your case, I understand that you want the inventory
service to access the db
service. So you should use the following datasource
url:
spring.datasource.url=jdbc:postgresql://db:5432/leisurely_diversion
请参阅以下有关连接到来自具有docker的另一个容器的容器:
See this simple tutorial about connecting to a container from another container with docker compose: https://docs.docker.com/compose/gettingstarted/
这篇关于Spring Boot,PostgreSQL和Docker-在容器中运行时拒绝连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!