繁体   English   中英

Docker 容器在远程服务器上启动时崩溃,如何正确运行?

[英]Docker container crashes at startup on a remote server, how to run correctly?

我有 Spring Boot 应用程序和以下 Dockerfile:

FROM openjdk:16

COPY build/libs/*.jar tg-bot.jar

ENTRYPOINT java -Dfile.encoding=UTF-8 -jar tg-bot.jar
EXPOSE 8080

该应用程序在我的 PC 上的 Docker 中正确运行:

docker run -p 8080:8080 tg-bot

然后我将图像推送到我的 Dockerhub 存储库,将它拉入我的 VPS 上的 Docker 并尝试使用相同的命令运行它:

docker run -p 8080:8080 tg-bot

当 Spring Boot 应用程序启动时,连接到 PostgreSQL 数据库时发生错误:

Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
  at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:315) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.Driver.makeConnection(Driver.java:465) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.Driver.connect(Driver.java:264) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.springframework.jdbc.datasource.SimpleDriverDataSource.getConnectionFromDriver(SimpleDriverDataSource.java:144) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
  at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:205) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
  at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:169) ~[spring-jdbc-5.3.9.jar!/:5.3.9]
  at liquibase.integration.spring.SpringLiquibase.afterPropertiesSet(SpringLiquibase.java:272) ~[liquibase-core-4.3.5.jar!/:na]
  ... 26 common frames omitted
Caused by: java.net.NoRouteToHostException: No route to host
  at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
  at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:669) ~[na:na]
  at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:549) ~[na:na]
  at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
  at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333) ~[na:na]
  at java.base/java.net.Socket.connect(Socket.java:645) ~[na:na]
  at org.postgresql.core.PGStream.createSocket(PGStream.java:231) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.core.PGStream.<init>(PGStream.java:95) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:98) ~[postgresql-42.2.23.jar!/:42.2.23]
  at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:213) ~[postgresql-42.2.23.jar!/:42.2.23]
  ... 34 common frames omitted

这是我的带有 db 设置的 application.yml:

spring:
  application:
    name: tg-bot
  r2dbc:
    url: r2dbc:postgresql://postgresql.j5321585.myjino.ru:5432/j5321585_tg_db
    username: ********
    password: ********
  liquibase:
    enabled: true
    change-log: classpath:db/scripts/changelog-master.xml
    url: jdbc:postgresql://postgresql.j5321585.myjino.ru:5432/j5321585_tg_db
    user: ********
    password: ********

使用相同的 application.yaml 在本地启动容器时没有错误。 可能是什么问题呢?

这取决于您如何运行 Postgres 应用程序。

如果 Postgres 在单独的服务器上运行,请确保可以从应用程序 Docker 容器中访问该服务器。

如果 Postgres 在同一服务器上作为 Docker 容器运行,您可以将应用程序和 Postgres Docker 容器作为 docker-compose 文件启动。 您可以为 Postgres docker 容器指定主机或 IP 地址,并在您的应用程序代码中使用相同的内容。

希望这是有帮助的。

暂无
暂无

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

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