如何编写脚本并在Docker Compose中创建ScyllaDB的Keyspace与表
解决ScyllaDB容器启动时自动创建Keyspace和Table的问题
步骤1:编写初始化脚本
创建名为init-scylla.sh的脚本,用于等待集群就绪并执行CQL命令:
#!/bin/bash # 循环等待ScyllaDB主节点可连接 until cqlsh scyllaDB-node1 -e "DESCRIBE KEYSPACES"; do echo "等待ScyllaDB节点就绪..." sleep 5 done # 创建Keyspace(按需修改名称和复制策略) cqlsh scyllaDB-node1 -e "CREATE KEYSPACE IF NOT EXISTS my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'web1': 3};" # 创建Table(按需修改表结构) cqlsh scyllaDB-node1 -e "CREATE TABLE IF NOT EXISTS my_keyspace.my_table ( id UUID PRIMARY KEY, name text, value int );" echo "Keyspace和Table创建完成"
给脚本添加执行权限:
chmod +x init-scylla.sh
步骤2:修改docker-compose.yml配置
添加一个单独的初始化服务,依赖所有ScyllaDB节点,执行上述脚本:
version: "3" services: scyllaDB-node1: container_name: scyllaDB-node1 image: scylladb/scylla:5.1.0 restart: always command: --seeds=scyllaDB-node1,scyllaDB-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0 networks: web1: scyllaDB-node2: container_name: scyllaDB-node2 image: scylladb/scylla:5.1.0 restart: always command: --seeds=scyllaDB-node1,scyllaDB-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0 networks: web1: depends_on: - scyllaDB-node1 scyllaDB-node3: container_name: scyllaDB-node3 image: scylladb/scylla:5.1.0 restart: always command: --seeds=scyllaDB-node1,scyllaDB-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0 networks: web1: depends_on: - scyllaDB-node1 - scyllaDB-node2 # 新增初始化服务 scylla-init: container_name: scylla-init image: scylladb/scylla:5.1.0 networks: web1: depends_on: - scyllaDB-node1 - scyllaDB-node2 - scyllaDB-node3 volumes: - ./init-scylla.sh:/init-scylla.sh command: ["bash", "/init-scylla.sh"] restart: "no" # 执行完成后自动退出,无需重启 networks: web1: driver: bridge
关键说明
- 复制策略:脚本中
NetworkTopologyStrategy的web1是你的Docker网络名称,3对应集群节点数,需根据实际情况调整。 - 就绪检测:脚本中的循环等待确保只有当ScyllaDB节点真正可连接时才执行创建命令,避免因容器启动但服务未就绪导致的失败。
- 初始化服务:设置
restart: no保证脚本仅执行一次,完成后容器自动退出。
内容的提问来源于stack exchange,提问作者Zaryab Ali
相关产品推荐
相关产品推荐

