带有docker compose的Cassandra初始化脚本
我想在Cassandra容器的开头创建键空间和列族 我在带有docker compose的Cassandra初始化脚本,cassandra,docker-compose,cqlsh,Cassandra,Docker Compose,Cqlsh,我想在Cassandra容器的开头创建键空间和列族 我在docker compose.yml文件中尝试了以下操作: # shortened for clarity cassandra: hostname: my-cassandra image: my/cassandra:latest command: "cqlsh -f init-database.cql" 图像my/cassandra:latest包含init database.cql中的/。但这似乎不起作用 有什么
docker compose.yml
文件中尝试了以下操作:
# shortened for clarity
cassandra:
hostname: my-cassandra
image: my/cassandra:latest
command: "cqlsh -f init-database.cql"
图像my/cassandra:latest
包含init database.cql
中的/
。但这似乎不起作用
有什么方法可以实现这一点吗?我们最近尝试在Cassandra的一个参考应用程序中解决一个类似的问题。我们正在使用Docker Compose来加速应用程序所需的环境,该应用程序包括一个DataStax企业(即Cassandra)节点。我们希望该节点在第一次开始安装CQL模式时进行一些引导(使用
cqlsh
运行.CQL
文件中的语句,就像您正在尝试的那样)。基本上,我们采取的方法是为Docker入口点编写一个shell脚本:
cqlsh-f
运行一些CQL语句并初始化模式这种方法有一个警告。这对我们来说非常有用,因为在我们的参考应用程序中,我们只旋转单个节点(即,我们不创建包含多个节点的集群)。如果正在运行多个节点,则可能需要确保只有一个节点执行引导以创建架构,因为多个客户端同时修改架构可能会导致集群出现一些问题。(这一点有望在某个时候得到解决。)我也在寻找这个问题的解决方案,下面是我完成这个问题的方法。
这里,Cassandra的第二个实例有一个带有schema.cql的卷,并运行CQLSH命令 我的版本使用,这样我们就可以摆脱睡眠命令
version: '2.2'
services:
cassandra:
image: cassandra:3.11.2
container_name: cassandra
ports:
- "9042:9042"
environment:
- "MAX_HEAP_SIZE=256M"
- "HEAP_NEWSIZE=128M"
restart: always
volumes:
- ./out/cassandra_data:/var/lib/cassandra
healthcheck:
test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
interval: 15s
timeout: 10s
retries: 10
cassandra-load-keyspace:
container_name: cassandra-load-keyspace
image: cassandra:3.11.2
depends_on:
cassandra:
condition: service_healthy
volumes:
- ./src/main/resources/cassandra_schema.cql:/schema.cql
command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
NetFlix使用睡眠的版本
version: '3.5'
services:
cassandra:
image: cassandra:latest
container_name: cassandra
ports:
- "9042:9042"
environment:
- "MAX_HEAP_SIZE=256M"
- "HEAP_NEWSIZE=128M"
restart: always
volumes:
- ./out/cassandra_data:/var/lib/cassandra
cassandra-load-keyspace:
container_name: cassandra-load-keyspace
image: cassandra:latest
depends_on:
- cassandra
volumes:
- ./src/main/resources/cassandra_schema.cql:/schema.cql
command: /bin/bash -c "sleep 60 && echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
p.S我在一个中找到了这种方法,我通过修补cassandra的
docker entrypoint.sh
解决了这个问题,这样它在启动时将执行sh
和cql
文件,这些文件位于/docker entrypoint initdb.d
中。这类似于MySQL docker容器的工作方式
基本上,我在docker entrypoint.sh
的末尾添加了一个小脚本(就在最后一行exec“$@”
),一旦cassandra启动,它将运行cql脚本。简化版本为:
INIT_DIR=docker入口点initdb.d
#整个块将在后台执行
(
cd$INIT_DIR
#等待卡桑德拉准备好
而!cqlsh-e'descripe cluster'>/dev/null 2>&1;do sleep 6;done
echo“$0:Cassandra集群就绪:正在执行$INIT_DIR中找到的cql脚本”
#按名称顺序查找并执行cql脚本
对于美元中的f(查找。-键入f-名称“*.cql”-打印|排序);执行
回显“$0:运行$f”
cqlsh-f“$f”
echo“$0:$f已执行”
完成
) &
此解决方案适用于所有cassandra版本(至少在撰写本文时3.11版本之前)
因此,您只需构建和使用此cassandra映像版本,然后使用docker compose卷向容器添加适当的初始化脚本
完整的gist以及更强大的入口点补丁(和示例)可用。回答得很好,谢谢。我只是想尝试一些类似于你建议的东西。这似乎是一个足够满足我需求的解决方案。不客气!我更新了答案,加入了关于多个节点的警告,因此,如果您处于这种情况,请务必记住这一点。docker compose 3+版本不再允许配置()中使用条件语法,可能只是一个提示的重复,这就是Netflix使用sleep的原因。@SachinGiri的基本想法是Cassandra有自己的工具可以执行CQL-CQLSH,因此在Cassandra启动自己的docker映像后,映像的第二个实例运行此工具,您可以在下面的一行->命令:/bin/bash-c“echo loading Cassandra keyspace&&CQLSH Cassandra-f/schema.CQL”中看到