我有一个连接到本地Postgres数据库的Spring应用程序。很好。
然后我从Spring应用程序创建了一个Docker映像。运行容器时,它将引发数据库连接错误。
我已遵循建议的here解决方案,但仍然遇到相同的错误。
[ERROR ] [task-1] c.z.h.p.HikariPool c.z.h.p.HikariPool.throwPoolInitializationException(HikariPool.java:593) – HikariPool-1 - Exception during pool initialization.
org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:285)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:217)
at org.postgresql.Driver.makeConnection(Driver.java:458)
at org.postgresql.Driver.connect(Driver.java:260)
我已经以几种方式运行docker映像,结果相同。
docker run app-image
docker run --network=host app-image
Dockerfile:
FROM java:8-jdk-alpine
COPY ./build/libs/runtime-0.0.1-SNAPSHOT.jar /usr/app/
WORKDIR /usr/app
ENTRYPOINT ["java", "-jar", "runtime-0.0.1-SNAPSHOT.jar"]
# Expose standard tomcat port
EXPOSE 9888
postgresql.conf:
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------
# - Connection Settings -
listen_addresses = '*'
pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
host postgres postgres 0.0.0.0/0 trust
host postgres postgres 172.17.0.0/16 trust
答案 0 :(得分:1)
spring应用程序尝试连接到localhost:5432
。由于主机和每个容器都是独立的网络实体(即主机和每个容器在docker内部网络中都有自己的网络地址),因此容器尝试连接到在其上运行的数据库。由于没有数据库在运行,因此无法建立连接。
要解决此问题,您需要获取docker内部网络内主机的IP地址(例如,参见this article at devilbox),并将该地址用作spring应用程序的数据库服务器。
我建议同时在docker容器中运行postgres。例如,您可以使用the official postgres image from dockerhub。然后,您可以在spring容器中以postgres容器的名称引用postgres容器。