You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动Cassandra Docker镜像时出现ConnectionRefusedError的原因排查

问题分析与解决方案

你的问题出在容器启动时cqlsh命令执行过早,Cassandra服务还没完全启动就绪就尝试连接,导致连接被拒绝。另外你的command配置存在语法错误(末尾多余的; fi')。

核心原因

Cassandra容器启动后,需要一定时间完成初始化、加载配置并启动服务,此时9042端口还未开放,直接执行cqlsh会连接失败。后续你用IJ能成功连接,是因为容器已经完成初始化,服务进入正常运行状态。

解决方案

有两种可靠的解决方式:

方案1:在command中添加等待逻辑,确保服务就绪后再执行命令

修改command部分,先循环检测Cassandra端口是否可用,再执行创建keyspace的命令:

version: '2'

services:
  cassandra:
    image: cassandra:latest
    ports:
      - 9042:9042
    environment:
      - CASSANDRA_AUTHENTICATOR=AllowAllAuthenticator
      - CASSANDRA_AUTHORIZER=AllowAllAuthorizer
    command: >
      bash -c '
        until cqlsh -e "DESCRIBE KEYSPACES"; do
          echo "Waiting for Cassandra to be ready..."
          sleep 5
        done
        cqlsh -e "CREATE KEYSPACE IF NOT EXISTS cbusha WITH replication = {'\''class'\'' : '\''SimpleStrategy'\'', '\''replication_factor'\'' : 1}"
      '

方案2:使用初始化脚本目录(符合Docker最佳实践)

Cassandra官方镜像支持将初始化脚本放在/docker-entrypoint-initdb.d/目录下,容器会自动在服务就绪后执行这些脚本:

  1. 创建初始化脚本文件(例如init.cql):
CREATE KEYSPACE IF NOT EXISTS cbusha
WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};
  1. 修改docker-compose.yml,将脚本挂载到容器的初始化目录:
version: '2'

services:
  cassandra:
    image: cassandra:latest
    ports:
      - 9042:9042
    environment:
      - CASSANDRA_AUTHENTICATOR=AllowAllAuthenticator
      - CASSANDRA_AUTHORIZER=AllowAllAuthorizer
    volumes:
      - ./init.cql:/docker-entrypoint-initdb.d/init.cql

补充说明

  • 方案2无需手动处理等待逻辑,镜像内部会自动判断服务状态,稳定性更高。
  • 原配置中command末尾的; fi'属于无效语法,必须移除,否则会导致命令执行失败。

内容的提问来源于stack exchange,提问作者Jackie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:16:04