簡體   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