【问题标题】:Init script for Cassandra with docker-compose带有 docker-compose 的 Cassandra 初始化脚本
【发布时间】:2017-03-19 12:34:15
【问题描述】:

我想在我的 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 cqlsh


【解决方案1】:

我也在寻找这个问题的解决方案,这就是我完成它的方法。
这里 Cassandra 的第二个实例有一个带有 schema.cql 的卷并运行 CQLSH 命令

My Version 加上healthcheck 这样我们就可以摆脱 sleep 命令

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 使用 sleep

的版本
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 之一发现了这种方式

【讨论】:

  • 请注意,docker-compose 3+ 版本不再允许在您的配置中使用条件语法 (docs.docker.com/compose/compose-file/#depends_on),这就是 Netflix 使用睡眠的原因。
  • @SachinGiri 基本思路是Cassandra有自己的工具可以执行CQL-CQLSH,所以Cassandra启动自己的docker镜像后,镜像的第二个实例运行这个工具,可以在这一行看到-> 命令:/bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /schema.cql"
  • 哇.. 只是复制粘贴,它节省了我一些时间。谢谢分享!
【解决方案2】:

我们最近尝试在 KillrVideo(Cassandra 的参考应用程序)中解决类似问题。我们正在使用 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】:

我通过修补 cassandra 的 docker-entrypoint.sh 解决了这个问题,因此它将在启动时执行位于 /docker-entrypoint-initdb.d 中的 shcql 文件。这类似于 MySQL docker 容器的工作方式。

基本上,我在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 卷将适当的初始化脚本添加到容器中。

完整的要点带有更强大的入口点补丁(和示例)可在here 获得。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多