将非容器本地 PostgreSQL 连接到本地 SpringBoot docker 容器

Posted

技术标签:

【中文标题】将非容器本地 PostgreSQL 连接到本地 SpringBoot docker 容器【英文标题】:Connecting non-container local PostgreSQL to local SpringBoot docker container 【发布时间】:2021-05-06 21:44:46 【问题描述】:

我有一个在非容器实例上运行的本地 PostgreSQL 实例,我不确定我是在 SpringBoot 还是在 Docker 中正确进行配置。在包含本地 PostgreSQL 实例的所有必要详细信息的 local 配置文件上运行 SpringBoot 应用程序时,启动成功。但是,当我通过 Docker 执行此操作时,一切都无法正常运行,而是在本地运行容器时返回此错误。

Dockerfile

FROM openjdk:15-alpine

ENV DB_URL=jdbc:postgresql://localhost:5432/sampledb
ENV DB_USER=dbuser
ENV DB_PASS=dbpass

ARG JAR_FILE=target/*.jar
COPY $JAR_FILE app.jar

ENTRYPOINT [ "java", \
    "-jar", \
    "-Dspring.profiles.active=docker", \
    "-Dapp.database.url=$DB_URL", \
    "-Dapp.database.user=$DB_USER", \
    "-Dapp.database.pass=$DB_PASS", \
    "/app.jar" ]

application-docker.properties

spring.datasource.url=$app.database.url
spring.datasource.username=$app.database.user
spring.datasource.password=$app.database.pass

我在构建Dockerfile 后使用此命令:

docker run -it -p 8080:8080 <container_name>

现在容器控制台日志打印出这个错误,我没有任何数据库连接。

2021-02-02 16:54:02.702 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : 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:303) ~[postgresql-42.2.18.jar!/:42.2.18]
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-42.2.18.jar!/:42.2.18]
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:225) ~[postgresql-42.2.18.jar!/:42.2.18]

我知道我应该将 PostgreSQL 设置为 docker 容器。但是,我需要 PostgreSQL 成为 Kubernetes 集群中的外部资源。

【问题讨论】:

本地 postgres 是否与 docker 容器运行在同一台机器上? 【参考方案1】:

好的,假设您在运行 docker 容器的同一台机器上运行 Postgres 数据库,有一个特殊的 DNS 指向主机的 localhost,即:host.docker.internal。 (记住 docker 容器中的 localhost 指向同一个容器)

所以,spring.datasource.url=host.docker.internal 应该指向您的主机 localhost 而不是 docker 容器。

【讨论】:

以上是关于将非容器本地 PostgreSQL 连接到本地 SpringBoot docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

使用 sqlalchemy 连接到本地 postgresql

使用 JDBC 连接到 PostgreSql 的本地实例

使用 Ngrok 从 AWS Lambda 连接到本地 PostgreSQL

地理服务器(VPS)连接到 PostgreSql(本地主机)

PostgreSql 本地连接到远程服务器 GCP

出于开发目的,无法从本地主机连接到 AWS RDS Postgresql