英文:
Connect Docker image to local Postgres
问题
以下是翻译好的内容:
我有一个连接到本地Postgres数据库的Spring应用程序。它运行正常。
然后我从Spring应用程序创建了一个Docker镜像。在运行容器时,它抛出了一个数据库连接错误。
我已经按照这里提供的解决方案进行了操作,但仍然得到相同的错误。
错误信息:
[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: 拒绝连接到 localhost:5432。请检查主机名和端口是否正确,并且 postmaster 是否接受 TCP/IP 连接。
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"]
# 暴露标准的Tomcat端口
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
英文:
I have a Spring app that connects to local Postgres db. It works fine.
I then created a Docker image from the Spring app. When running the container it throws a db connection error.
I have followed the solution suggested here, but still getting the same error.
[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)
I have run the docker image in several ways with the same result.
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
答案1
得分: 1
The spring application tries to connect to localhost:5432
.Since the host and each container are separate network entities, the container tries to connect to the database running on it.Since there is no database running, the connection cannot be established.
To fix this issue, you need to get the IP address of the host machine within the docker-internal network and use this address as the database server for the spring application.
I would recommend running the postgres in a docker container as well. You can use the official postgres image from Docker Hub. Then you can reference the postgres container from within the spring container by the postgres container's name.
英文:
The spring application tries to connect to localhost:5432
. Since the host and each container are separate network entities (i.e., the host and each container has its own network address in the docker-internal network), the container tries to connect to the database running on it. Since there is not database running, the connection cannot be established.
To fix this issue, you need to get the IP address of the host machine within the docker-internal network (see, e.g., this article at devilbox) and use this address as database server for the spring application.
I would recommend to run the postgres in a docker container aswell. You can, for example, use the official postgres image from dockerhub. Then you can reference the postgres-container from within the spring-container by the postgres-container's name.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论