Java 容器之间的连接问题(我想…)

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容器)

我正在使用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:

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相关的异常。显然,我将改进隐式等待,但现在知道异常的来源将更容易处理,非常感谢!!