Java 容器之间的连接问题(我想…)
我正在使用docker compose运行3个容器 1-My Web应用程序 2-Postgres 3-卡桑德拉 一旦我使用: 码头工人整理 My webapp启动此异常: com.datastax.driver.core.exceptions.NoHostAvailableException:所有主机 尝试查询失败(尝试:cassandra/172.17.0.3:9042 一旦所有容器都运行了,我就可以进入我的webapp,并尝试在cassandras容器死亡之前ping它(webapp容器),并且所有数据包都成功返回,所以我猜它们之间确实存在连接 最奇怪的是,一旦我得到这个例外: .InvalidQueryException:键空间“myKeyspace”不存在 这意味着连接已经建立,但在我添加持久性并创建上述模式之前,我并没有对compose.yml进行任何更改以获得这个新结果 这是我的docker-compose.yml:Java 容器之间的连接问题(我想…),java,docker,cassandra,docker-compose,Java,Docker,Cassandra,Docker Compose,我正在使用docker compose运行3个容器 1-My Web应用程序 2-Postgres 3-卡桑德拉 一旦我使用: 码头工人整理 My webapp启动此异常: com.datastax.driver.core.exceptions.NoHostAvailableException:所有主机 尝试查询失败(尝试:cassandra/172.17.0.3:9042 一旦所有容器都运行了,我就可以进入我的webapp,并尝试在cassandras容器死亡之前ping它(webapp容器)
version: '3.1'
services:
cassandra:
container_name: "cassandra"
image: cassandra
ports:
- 9042:9042
volumes:
- /home/cassandra:/var/lib/cassandra
postgresql:
container_name: "postgresql"
image: postgres:11.1-alpine
restart: always
environment:
POSTGRES_DB: mywebapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
#- ./startup.sql:/docker-entrypoint-initdb.d/startup.sql
- postgresdata:/var/lib/postgresql/data
ports:
- 5432:5432
mywebapp:
container_name: "mywebapp"
image: openjdk:10-jre-slim
hostname: mywebapp
volumes:
- ./lib:/home/lib
- ./mywebapp-1.0.1-SNAPSHOT-exec.jar:/home/mywebapp-1.0.1-SNAPSHOT-exec.jar
entrypoint:
- java
- -jar
- -Djava.library.path=/home/lib
- /home/mywebapp-1.0.1-SNAPSHOT-exec.jar
environment:
- LD_LIBRARY_PATH=/home/lib
- spring.datasource.url=jdbc:postgresql://postgresql:5432/mywebapp
- spring.cassandra.contactpoints=cassandra
- spring.cassandra.port=9042
- spring.cassandra.keyspace=mywebapp
#- spring.datasource.username=postgres
#- spring.datasource.password=postgres
#- spring.jpa.hibernate.ddlAuto=update+
ports:
- 8443:8443
- 8080:8080
depends_on:
- cassandra
卷数:
postgresdata:
提前感谢大家我假设您的web应用程序需要cassandra服务在启动时运行。您应该向web应用程序服务添加
项,以便docker仅在cassandra启动时启动它
而且,链接
条目是不必要的,因为docker会自动将服务名称用作为docker compose项目创建的网络中的主机名。网络类型:网桥
-这是默认的网络类型,因此您可以在您的情况下忽略它。谢谢您的帮助,我刚刚编辑了我的compose.yml看起来像现在一样。仍然遇到完全相同的问题。不知道我是否做对了我的猜测是cassandra有一些时间启动它?一些初始化进程,可能会花费太长的时间,所以docker假设服务已经启动(因为它是,它只需要做额外的启动工作)因此,启动web应用程序感觉也不错……您可以尝试在web应用程序周围创建一个包装外壳脚本,并将其用作容器的入口点,在启动应用程序之前,实际检查cassandra是否可访问。或者您可以尝试为cassandra服务定义一个healthcheck命令检查有关的部分“在Cassandra init完成之前没有连接”您可以在bash中使用一个简单的while循环,并检查Cassandra是否可以通过某些netcat或类似工具访问这似乎是开始寻找解决方案的一个好方法谢谢!!!!!我刚刚使用了一个sleep命令,看起来它可以工作(现在我需要处理最后一个异常,或者希望如此),但不再启动与cassandra相关的异常。显然,我将改进隐式等待,但现在知道异常的来源将更容易处理,非常感谢!!