启动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/目录下,容器会自动在服务就绪后执行这些脚本:
- 创建初始化脚本文件(例如
init.cql):
CREATE KEYSPACE IF NOT EXISTS cbusha WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 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
相关产品推荐
相关产品推荐

