这是 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...
上述日志不断被打印一次又一次。
在这里可以做什么来建立连接?
我无法访问
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!"