代码之家  ›  专栏  ›  技术社区  ›  blakelead

使用docker compose为Cassandra初始化脚本

  •  17
  • blakelead  · 技术社区  · 8 年前

    我希望在我的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 在里面 / 但这似乎不起作用。

    有没有办法做到这一点?

    3 回复  |  直到 8 年前
        1
  •  20
  •   Pedro Carneiro Lee Theobald    6 年前

    我也在寻找这个问题的解决方案,下面是我是如何做到这一点的。
    这里,Cassandra的第二个实例有一个卷 schema.cql

    我的版本 具有 healthcheck 睡觉 命令

    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:我在一个 Netflix Repos

        2
  •  14
  •   Luke Tillman    8 年前

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

    1. 正常启动节点,但 背景 .
    2. 等待直到端口9042可用(这是客户端连接以运行CQL语句的地方)。
    3. 使用 cqlsh -f 运行一些CQL语句并初始化模式。
    4. 停止正在后台运行的节点。
    5. 继续到Docker镜像的通常入口点,正常启动节点(如Docker所期望的那样在前台)。

    我们只是使用文件的存在来指示节点是否已经启动,并在启动时检查它,以确定我们是否需要执行上面的逻辑,还是可以正常启动它。您可以在中看到结果 killrvideo-dse-docker repository on GitHub .

    由于多个客户端同时修改模式可能会导致集群出现一些问题,因此,其中的个节点执行引导以创建模式。(这个 is a known issue 并且希望在某个点被固定。)

        3
  •  4
  •   Derlin    4 年前

    我通过修补卡桑德拉的解决了这个问题 docker-entrypoint.sh 因此,它将执行 sh cql /docker-entrypoint-initdb.d

    基本上,我在 docker-entrypoint.sh (就在最后一行之前, exec "$@" ),这将在cassandra启动后运行cql脚本。简化版本为:

    INIT_DIR=docker-entrypoint-initdb.d
    # this whole block will execute in the background
    (
        cd $INIT_DIR
        # wait for cassandra to be ready
        while ! cqlsh -e 'describe cluster' > /dev/null 2>&1; do sleep 6; done
        echo "$0: Cassandra cluster ready: executing cql scripts found in $INIT_DIR"
        # find and execute cql scripts, in name order
        for f in $(find . -type f -name "*.cql" -print | sort); do
            echo "$0: running $f"
            cqlsh -f "$f"
            echo "$0: $f executed"
        done
    ) &
    

    该解决方案适用于所有cassandra版本(至少在编写本文时3.11之前)。

    因此,您只需要构建和使用这个cassandra映像版本,然后使用docker compose卷向容器添加适当的初始化脚本。

    A. 完整的要点 有了更强大的入口点补丁(和示例) here .