У меня есть следующий 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 и знать, что он работает.
Я думаю, проблема в том, что сервер 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 стал доступен, требуется некоторое время (примерно минута).
Конечно! Вы можете создать производный образ и запустить в нем сценарий инициализации. Однако после завершения работы отдельный контейнер инициализации исчезнет. И это тот же образ, что и в другой службе, поэтому никаких дополнительных затрат здесь тоже нет.
Есть ли шанс, что вы сможете указать мне на документы по этому поводу?
Конечно. Взгляните на stackoverflow.com/questions/78215539/….
Это отлично работает, но было бы неплохо использовать сайдкар или какой-то другой способ удалить изображение после завершения вместо того, чтобы всегда иметь неработающий контейнер.