Docker容器间Cassandra远程cqlsh连接失败及传参停滞问题排查
Cassandra容器连接及Schema初始化问题排查与解决
问题背景
使用Docker Compose部署db_cassandra和remote_cassandra两个服务,remote_cassandra需远程连接db_cassandra执行Schema初始化脚本,但脚本陷入无限循环,日志提示socket.gaierror无法解析db_cassandra主机名。后续尝试通过CMD传参给脚本,容器执行仍停滞。
现有配置文件
docker-compose.yml
version: "3" services: db_cassandra: container_name: db_cassandra image: custom.cassandra.image/builder-cassandra volumes: - "./common/cassandra:/lua/cassandra_setup:rw" environment: WORKSPACE: "/tmp" SERVICES_ROOT_DIR: "/services_root" healthcheck: test: ["CMD", "cqlsh", "-u", "cassandra", "-p", "cassandra" ] interval: 5s timeout: 5s retries: 60 ports: - "9042:9042" remote_cassandra: container_name: remote_cassandra build: context: ../. dockerfile: ./it/remote_cassandra/Dockerfile args: BASE_IMAGE: custom.cassandra.image/builder-cassandra depends_on: dd_cassandra: condition: service_healthy volumes: - "./common/cassandra:/lua/cassandra_setup:rw" environment: WORKSPACE: "/tmp" SERVICES_ROOT_DIR: "/services_root"
remote_cassandra/Dockerfile(初始版本)
ARG BASE_IMAGE FROM ${BASE_IMAGE} COPY ./it/common/cassandra/cassandra-setup.sh / RUN chmod +x /cassandra-setup.sh CMD ["/cassandra-setup.sh"]
初始cassandra-setup.sh脚本
#!/bin/bash #code that creates schema.cql ... while ! cqlsh db_cassandra -e 'describe cluster' ; do echo "waiting for db_cassandra to be up..." sleep .5 done cqlsh db_cassandra -f "${WORKSPACE}/schema.cql"
报错日志
Traceback (most recent call last): File "/opt/cassandra/bin/cqlsh.py", line 2357, in <module> main(*read_options(sys.argv[1:], os.environ)) File "/opt/cassandra/bin/cqlsh.py", line 2303, in main shell = Shell(hostname, File "/opt/cassandra/bin/cqlsh.py", line 463, in __init__ load_balancing_policy=WhiteListRoundRobinPolicy([self.hostname]), File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 425, in __init__ File "/opt/cassandra/bin/../lib/cassandra-driver-internal-only-3.25.0.zip/cassandra-driver-3.25.0/cassandra/policies.py", line 426, in <listcomp> File "/usr/lib/python3.10/socket.py", line 955, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -2] Name or service not known waiting for db_cassandra to be up...
修改后的配置(问题未解决)
修改后的Dockerfile
ENTRYPOINT ["/cassandra-setup.sh"] CMD ["db_cassandra"]
修改后的cassandra-setup.sh脚本
#!/bin/bash DB_CONTAINER="$1" #code that creates schema.cql ... while ! cqlsh $DB_CONTAINER -e 'describe cluster' ; do echo "waiting for db_cassandra to be up..." sleep .5 done cqlsh $DB_CONTAINER -f "${WORKSPACE}/schema.cql"
解决方案
1. 修复Docker Compose依赖名称错误
remote_cassandra的depends_on配置中误写为dd_cassandra,实际服务名是db_cassandra,这会导致依赖健康检查失效,remote_cassandra可能提前启动。修改docker-compose.yml中对应部分:
depends_on: db_cassandra: condition: service_healthy
2. 优化健康检查逻辑
原db_cassandra的健康检查未指定主机,可能存在自身连接问题,修改为明确检查本地连接:
healthcheck: test: ["CMD", "cqlsh", "localhost", "-u", "cassandra", "-p", "cassandra", "-e", "SELECT now() FROM system.local"] interval: 5s timeout: 5s retries: 60
3. 调整初始化脚本的连接测试逻辑
原脚本使用describe cluster检查过于严格,且未处理Schema文件未生成的情况,替换为更可靠的连接测试,并增加文件等待逻辑:
#!/bin/bash # 若未传参则使用默认主机名 DB_HOST="${1:-db_cassandra}" # 等待schema.cql文件生成 until [ -f "${WORKSPACE}/schema.cql" ]; do echo "等待schema.cql文件生成..." sleep 1 done # 测试Cassandra基础连接,设置超时时间 while ! cqlsh "$DB_HOST" -u cassandra -p cassandra --connect-timeout 2 -e 'SELECT now() FROM system.local'; do echo "等待db_cassandra服务就绪..." sleep 1 done # 执行Schema初始化 echo "开始执行Schema初始化..." cqlsh "$DB_HOST" -u cassandra -p cassandra -f "${WORKSPACE}/schema.cql" echo "Schema初始化完成"
4. 验证网络连通性
Docker Compose默认会为项目创建专属网络,服务名可直接作为DNS解析。若自定义了网络,需确保db_cassandra和remote_cassandra都加入同一网络。
内容的提问来源于stack exchange,提问作者asn
相关产品推荐
相关产品推荐

