Почему я получаю ConnectionRefusedError при запуске команды при попытке запустить образ Cassandra Docker?

У меня есть следующий docker-compose.yml файл...

version: '2'

services:
  cassandra:
    image: cassandra:latest
    ports:
      - 9042:9042
    environment:
      - CASSANDRA_AUTHENTICATOR=AllowAllAuthenticator
      - CASSANDRA_AUTHORIZER=AllowAllAuthorizer
    command: >
      cqlsh -e "CREATE KEYSPACE IF NOT EXISTS cbusha
      WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1}"; fi'

Но теперь, когда я пытаюсь бежать docker-compose up, я получаю

2024-03-22 22:16:47 Connection error: ('Unable to connect to any servers', {'127.0.0.1:9042': ConnectionRefusedError(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})

Что мне не хватает?

Я могу подключиться к нему с помощью инструмента IJ и знать, что он работает.

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, проблема в том, что сервер Cassandra не готов, когда вы пытаетесь запустить команду cqlsh. Однако, очевидно, к тому времени, когда вы получите к нему доступ с помощью IJ, он будет готов.

Попробуйте эту настройку, которая ожидает готовности сервера.

🗎 docker-compose.yml

version: '2'

services:
  cassandra:
    container_name: cassandra
    image: cassandra:latest
    ports:
      - 9042:9042
    environment:
      - CASSANDRA_AUTHENTICATOR=AllowAllAuthenticator
      - CASSANDRA_AUTHORIZER=AllowAllAuthorizer
    logging:
      driver: none

  cassandra-init:
    image: cassandra:latest
    volumes:
      - ./init-cassandra.sh:/init-cassandra.sh
    command: /bin/bash /init-cassandra.sh
    depends_on:
      - cassandra

🗎 init-cassandra.sh

#!/bin/bash

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

echo "Create keyspace..."
cqlsh -e "CREATE KEYSPACE IF NOT EXISTS cbusha WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};" cassandra 9042
echo "Done!"

Как вы можете видеть на скриншоте ниже, для того, чтобы сервер Cassandra стал доступен, требуется некоторое время (примерно минута).

Это отлично работает, но было бы неплохо использовать сайдкар или какой-то другой способ удалить изображение после завершения вместо того, чтобы всегда иметь неработающий контейнер.

Jackie 24.03.2024 14:07

Конечно! Вы можете создать производный образ и запустить в нем сценарий инициализации. Однако после завершения работы отдельный контейнер инициализации исчезнет. И это тот же образ, что и в другой службе, поэтому никаких дополнительных затрат здесь тоже нет.

datawookie 24.03.2024 17:46

Есть ли шанс, что вы сможете указать мне на документы по этому поводу?

Jackie 24.03.2024 18:54

Конечно. Взгляните на stackoverflow.com/questions/78215539/….

datawookie 25.03.2024 10:13

Другие вопросы по теме