繁体   English   中英

Quarkus docker 容器无法运行/连接到数据库

[英]Quarkus docker container failed to run / connect to the DB

在我的项目中,使用 Quarkus、Angular 和 PostgreSQL 数据库,当我在开发模式下运行后端和前端时,我可以连接到数据库(这是在 docker 容器中运行的 postgreSQL 映像)并在表中创建新行和只是工作正常。 当然 Quarkus docker 文件是自动生成的。 这是我输入的“application.properties”文件(在 Quarkus 项目中):

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username= username
quarkus.datasource.password= pwd
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db-mcs-thirdparty
quarkus.flyway.migrate-at-start=true
quarkus.flyway.baseline-on-migrate=true
quarkus.flyway.out-of-order=false
quarkus.flyway.baseline-version=1

这是我放在后端文件夹(Quarkus)中的“docker-compose.yml”文件:

version: '3.8'
services:
  db:
    container_name: pg_container
    image: postgres:latest
    restart: always
    environment:
      POSTGRES_USER: username
      POSTGRES_PASSWORD: pwd
      POSTGRES_DB: db-mcs-thirdparty
    ports:
      - "5432:5432"

  pgadmin:
      container_name: pgadmin4_container
      image: dpage/pgadmin4
      restart: always
      environment:
        PGADMIN_DEFAULT_EMAIL: usernamepgadmin
        PGADMIN_DEFAULT_PASSWORD: pwdpgadmin
      ports:
        - "5050:80"

但是当我构建一个 Quarkus docker 镜像并尝试在 docker 容器中运行它时,它失败了!! 知道 Angular docker 容器运行良好,数据库也是如此。 这是我在运行容器后得到的错误日志:

使用 /opt/jboss/container/java/run/run-java.sh 启动 Java 应用程序 ...

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/

2022-05-06 12:58:31,967 WARN  [io.agr.pool] (agroal-11) Datasource '<default>': The connection attempt failed.
2022-05-06 12:58:32,015 ERROR [io.qua.run.Application] (main) Failed to start application (with profile prod): java.net.UnknownHostException: db

at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:229)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at org.postgresql.core.PGStream.createSocket(PGStream.java:241)
at org.postgresql.core.PGStream.<init>(PGStream.java:98)
at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:109)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:235)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:49)
at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223)
at org.postgresql.Driver.makeConnection(Driver.java:400)
at org.postgresql.Driver.connect(Driver.java:259)
at io.agroal.pool.ConnectionFactory.createConnection(ConnectionFactory.java:210)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:513)
at io.agroal.pool.ConnectionPool$CreateConnectionTask.call(ConnectionPool.java:494)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at io.agroal.pool.util.PriorityScheduledExecutor.beforeExecute(PriorityScheduledExecutor.java:75)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1126)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)

所以我在以下位置替换了“localhost”:

quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/db-mcs-thirdparty

使用 IP 地址,使用数据库的名称,甚至我尝试在同一行中输入用户名和 psw 等....,但没有用。

我什至停止了所有正在运行的容器(数据库、前端)并尝试只运行 Quarkus 容器,同样的情况也发生了。 对于我使用的端口,您可以查看附件图像。 使用的端口

应该如何解决这个问题? 先感谢您。

application.properties文件中的localhost url 是指容器自己的系统 localhost。 这意味着您的 quarkus 应用程序容器在其自己的本地端口上寻找该端口。

据我所知,每个 docker docker-container和每个启动docker-compose.yaml创建自己的网络,并且只有在这个网络中,启动的服务才能通过它们的服务名称进行连接。

因此,您的 quarkus docker 容器必须连接到由 docker-compose 启动的服务。 一种解决方案可能是在一个 docker-compose.yaml 中定义所有服务(数据库、角度和后端),然后在您的 url 中引用服务名称。

另一种解决方案可能是使用host.docker.internal而不是localhost

可在此处说明有关 docker 网络和host.docker.internal的更多信息: https ://docs.docker.com/desktop/windows/networking/

您可以使用网络模式主机 ( --network host ) 运行 Quarkus 容器,如下例所示:

$ docker run --rm -d --network host --name my_nginx nginx

https://docs.docker.com/network/network-tutorial-host/

你也可以像这个例子一样将你的 Quarkus 添加到你的 docker-compose 中:

https://github.com/quarkusio/quarkus-quickstarts/blob/main/kafka-quickstart/docker-compose.yaml

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM