Quarkus docker容器运行/连接DB失败



在我的项目中,使用Quarkus, Angular和PostgreSQL DB,当我运行后端&和前端在开发模式,我可以连接到DB(这是postgreSQL图像运行在一个docker容器),并在表中创建新的行,只是工作得很好。当然,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

,这是"docker- composition . html "我放在后端文件夹(Quarkus)中的文件:

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容器运行良好,DB也是如此。下面是运行容器后得到的错误日志:

使用/opt/jboss/container/Java/run/run- Java .sh…

__  ____  __  _____   ___  __ ____  ______
--/ __ / / / / _ | / _ / //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ / 
--________/_/ |_/_/|_/_/|_|____/___/
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地址,与DB的名称,甚至我试图输入用户名和psw在同一行,等....

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

应该如何解决这个问题?提前谢谢你。

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

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

因此你的quarkus docker容器必须连接到由docker-compose启动的服务。一种解决方案是在一个docker-compose中定义所有服务(数据库、angular和后端)。在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

相关内容

  • 没有找到相关文章

最新更新