通过 Dockerized Spring Boot 应用程序填充 Dockerized PostgreSQL 数据库

Posted

技术标签:

【中文标题】通过 Dockerized Spring Boot 应用程序填充 Dockerized PostgreSQL 数据库【英文标题】:Populating a Dockerized PostgreSQL Database through a Dockerized Spring Boot Application 【发布时间】:2021-01-29 20:48:10 【问题描述】:

我有一个在 Docker 中运行的 Postgres 服务器。在这个 Postgres 服务器中,我有一个名为“aa”的数据库。

我还有一个 Spring Boot 应用程序的 Docker 映像。在 Docker 中执行此映像时,应在数据库 'aa' 中创建数据库表。

为了实现这一点,我执行了以下步骤:

    在 Docker 中运行 Postgres 服务器

    docker run --name PostgresServer --e POSTGRES_PASSWORD=*** -d Postgres

    输入 PostgresServer 然后创建数据库 'aa'

    sudo docker exec -it PostgresServer psql -U postgres

    创建数据库 AA;

3. 运行 Sprint Boot Docker Image(这就是问题所在)

docker run -v /Users/juancesard.pineda/Desktop/brapi:/home/brapi/properties -d brapicoordinatorselby/brapi-java-server:v2

    我检查了日志:它说数据库 'aa' 不存在,显然它存在于 Postgres 服务器中

    org.postgresql.util.PSQLException: FATAL: 数据库“aa”不存在

一些附加信息:

Docker 监听 8080 端口

Postgres 服务器侦听端口 5432

我的 application.properties 文件如下所示:

server.port = 8080 server.servlet.context-path=/Users/juancesard.pineda/Desktop/brapi/application.properties/germplasm

spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/aa spring.datasource.username=postgres spring.datasource.password=jcpineda

spring.datasource.driver-class-name=org.postgresql.Driver

spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=false spring.jpa.properties.hibernate.hbm2ddl.import_files=sql/crops.sql、sql/lists.sql、sql/locations.sql、sql/people.sql、sql/programs.sql、sql/trials.sql、sql/ seasons.sql、sql/studies.sql、sql/breeding_methods.sql、sql/germplasm.sql、sql/attribute_defs.sql、sql/attribute_values.sql、sql/seed_lots.sql、sql/observation_units.sql、sql/crosses。 sql, sql/pedigree.sql, sql/events.sql, sql/images.sql, sql/observation_variables.sql, sql/observations.sql, sql/samples.sql, sql/allele_calls.sql, sql/genome_maps.sql, sql/references.sql, sql/vendor.sql

spring.mvc.dispatch-options-request=true

我的 application.properties 文件中是否缺少一些配置?

提前谢谢你

【问题讨论】:

保持sql独立于spring boot,你可以创建扩展postgres的docker镜像并在启动时执行你的sql,否则如果你使用flyway它会为你做的 我认为application.properties文件通常是文本文件;您已将图像附加到您的问题中。您能否重写问题,列出您以纯文本而不是屏幕截图形式运行的相关源代码和命令? 【参考方案1】:

问题出在您的 application.properties 文件中。数据源 url 指向host.docker.internal。这应该只在将 docker 容器内部的东西连接到主机上 docker 外部运行的东西时使用 (documentation)。您需要一个不同的解决方案,因为您的 Spring 服务器和 Postgres 服务器都在 docker 容器中运行。

您需要一个 Docker 网络,特别是一个桥接网络,来连接您的不同容器。 Docker Bridge Networks

试试这样的

    运行此命令在 docker 中创建一个名为“brapi_net”的网络 $> docker network create --driver bridge network_name

    运行 postgres 容器并将其链接到网络。像往常一样创建您的数据库模式。 $> docker run --name PostgresServer --network=network_name --e POSTGRES_PASSWORD=*** -d Postgres $> sudo docker exec -it PostgresServer psql -U postgres $> CREATE DATABASE aa;

    对于 Docker 网络,容器名称充当服务器名称。修改您的 application.properties 以反映这一点 spring.datasource.url=jdbc:postgresql://PostgresServer:5432/aa

    运行服务器容器并将其链接到网络$> docker run -v /Users/juancesard.pineda/Desktop/brapi:/home/brapi/properties --network=network_name -d brapicoordinatorselby/brapi-java-server:v2

【讨论】:

以上是关于通过 Dockerized Spring Boot 应用程序填充 Dockerized PostgreSQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

dockerized postgres 和 dockerized Spring boot app

无法将 dockerized spring boot 应用程序连接到 dockerized postgresql

Dockerized Spring boot 和 Zuul

dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

Dockerized Spring Boot 应用程序连接到主 MySQL [重复]

java.net.UnknownHostException 来自 Spring Boot 应用程序的 dockerized mysql