无法远程 cqlsh 到 cassandra docker 容器

问题描述 投票:0回答:1

这是 docker-compose 文件:

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"]

remote_cassandra
远程连接到 db_cassandra 并执行某些查询。 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"

while 循环使

remote_cassandra
等待 db_cassandra 启动并运行,以便它可以远程运行 schema.cql 以填充 db_cassandra 中存在的某些表。

但是,上述脚本会陷入无限循环,其中remote_cassandra无法远程cqlsh到db_cassandra。

以下是日志:

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...

上述日志不断被打印一次又一次。

在这里可以做什么来建立连接?

docker docker-compose cassandra
1个回答
0
投票

我无法访问

custom.cassandra.image/builder-cassandra
图像,因此只需在
cassandra:latest
服务中使用
db_cassandra

这是满足您要求的最小设置。

├── cassandra-setup.sh
├── docker-compose.yml
└── Dockerfile

🗎

docker-compose.yml
(基于
docker-compose.yml
,但精简到最低要求。)

version: "3"
services:
  db_cassandra:
    container_name: db_cassandra
    image: cassandra:latest
    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"
    logging:
      driver: none

  remote_cassandra:
    container_name: remote_cassandra
    build:
      context: .

🗎

Dockerfile

FROM cassandra:latest

COPY cassandra-setup.sh /
RUN chmod +x /cassandra-setup.sh

CMD ["/cassandra-setup.sh"]

🗎

cassandra-setup.sh

#!/bin/bash

echo "🔵 Starting setup."

until cqlsh -e "describe cluster" db_cassandra 9042 >/dev/null 2>&1; do
  echo "🟠 Waiting for Cassandra to be ready."
  sleep 10
done

echo "🟣 Cassandra is ready. Describe the keyspaces."
cqlsh -e "describe keyspaces" db_cassandra 9042

echo "🟢 Done!"

© www.soinside.com 2019 - 2024. All rights reserved.