Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有docker compose的Cassandra初始化脚本_Cassandra_Docker Compose_Cqlsh - Fatal编程技术网

带有docker compose的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中的/。但这似乎不起作用 有什么

我想在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
中的
/
。但这似乎不起作用


有什么方法可以实现这一点吗?

我们最近尝试在Cassandra的一个参考应用程序中解决一个类似的问题。我们正在使用Docker Compose来加速应用程序所需的环境,该应用程序包括一个DataStax企业(即Cassandra)节点。我们希望该节点在第一次开始安装CQL模式时进行一些引导(使用
cqlsh
运行
.CQL
文件中的语句,就像您正在尝试的那样)。基本上,我们采取的方法是为Docker入口点编写一个shell脚本:

  • 在后台正常启动节点
  • 等待端口9042可用(这是客户端连接以运行CQL语句的地方)
  • 使用
    cqlsh-f
    运行一些CQL语句并初始化模式
  • 停止正在后台运行的节点
  • 继续到Docker映像的通常入口点,该入口点正常启动节点(如Docker所期望的那样位于前景中)
  • 我们只需要使用文件的存在来指示节点是否已经启动,并在启动时检查,以确定是否需要执行上述逻辑,或者是否可以正常启动它。您可以在中看到结果


    这种方法有一个警告。这对我们来说非常有用,因为在我们的参考应用程序中,我们只旋转单个节点(即,我们不创建包含多个节点的集群)。如果正在运行多个节点,则可能需要确保只有一个节点执行引导以创建架构,因为多个客户端同时修改架构可能会导致集群出现一些问题。(这一点有望在某个时候得到解决。)

    我也在寻找这个问题的解决方案,下面是我完成这个问题的方法。
    这里,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”中看到