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

使用cassandra在docker容器中自动创建密钥空间

  •  18
  • jossemarGT  · 技术社区  · 9 年前

    我想知道是否有人尝试用默认键空间构建cassandra docker映像,我尝试过在build时间构建,但没有成功,因为cassandra没有在该阶段运行。与此类似:

    FROM cassandra:2.0
    COPY ../somewhere/keyspace_definition.txt /src/keyspace_definition.txt
    RUN /usr/bin/cqlsh -f /src/keyspace_definition.txt
    

    我的新方法是从入口点脚本开始,但是,如果其他人有更好的想法,我现在就想这样做。

    快乐发货:D

    6 回复  |  直到 9 年前
        1
  •  19
  •   aleung    7 年前

    根据@jan oudrinky和@alexander morozov的回答,我构建了一个新的docker图像,该图像带有原始的包装 docker-entrypoint.sh 在环境变量时创建键空间 CASSANDRA_KEYSPACE 设置。它在开发/测试环境中很有用。

    它不会修改 docker-entrypoint.sh 因此,即使cassandra基础图像有任何修改,您也只需要重建。

    Dockerfile文件

    FROM cassandra
    
    COPY entrypoint-wrap.sh /entrypoint-wrap.sh
    ENTRYPOINT ["/entrypoint-wrap.sh"]
    CMD ["cassandra", "-f"]
    

    入口点-wrap.sh

    #!/bin/bash
    
    if [[ ! -z "$CASSANDRA_KEYSPACE" && $1 = 'cassandra' ]]; then
      # Create default keyspace for single node cluster
      CQL="CREATE KEYSPACE $CASSANDRA_KEYSPACE WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};"
      until echo $CQL | cqlsh; do
        echo "cqlsh: Cassandra is unavailable - retry later"
        sleep 2
      done &
    fi
    
    exec /docker-entrypoint.sh "$@"
    
        2
  •  9
  •   Jan Oudrnicky    8 年前

    今天解决了这个问题。生成图像,覆盖默认Cassandra docker-entrypoint.sh 前面有一个修改的、附加的 exec "$@"

    for f in docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)     echo "$0: running $f"; . "$f" ;;
            *.cql)    echo "$0: running $f" && until cqlsh -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;;
            *)        echo "$0: ignoring $f" ;;
        esac
        echo
    done
    

    放入所需的*。图像中的cql docker-entrypoint-initdb.d/ .

    映像将启动,启动cassandra,并重试插入数据库,除非成功。确保你的脚本 IF NOT EXISTS 否则脚本将无限期运行。

        3
  •  3
  •   NotMyFaultSir    6 年前

    我正在使用Spring Boot docker容器访问我的cassandra容器。一切都是由码头工人创作的。 this tutorial 结合以下代码对我有用。

    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(KEYSPACE);
    
        return Arrays.asList(specification);
    }
    
        4
  •  0
  •   Rory Savage    9 年前

    我觉得有趣的是,还没有人对此作出回应。你可以理解他们在我假设的容器中运行MySQL时所做的。

    请参阅此链接: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

    您放入该目录中的任何脚本都将通过/entrypoint执行。sh脚本。看起来像卡桑德拉的入口。sh脚本尚不支持此功能。然而它可以!

        5
  •  0
  •   Alexander Morozov    8 年前

    我用了这个决定。我删除了文件中的最后一行 docker-entrypoint.sh 并在末尾插入以下行:

    exec "$@" > /dev/null &
    sleep 30 && echo "CREATE KEYSPACE <YOUR_KEYSAPCE> WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" | cqlsh > /dev/null && tail -n 10000 -f /var/log/cassandra/system.log
    

    然后有必要重建docker图像。

        6
  •  0
  •   ozinal    2 年前

    第一次执行容器时,它将执行扩展名为.sh、.ccl或.ccl的文件。gz位于/docker入口点initdb。d按文件名排序。通过将环境变量CASSANDRA_IGNORE_INITDB_CRIPTS设置为yes或true以外的值,可以跳过此行为。

    为了在docker映像中包含自定义文件,您可以将它们作为卷装载。

    $ docker run --name cassandra \
      -v /path/to/init-scripts:/docker-entrypoint-initdb.d \
      -v /path/to/cassandra-persistence:/bitnami
      bitnami/cassandra:latest
    

    或与docker组合

    cassandra:
      image: bitnami/cassandra:latest
      volumes:
        - /path/to/init-scripts:/docker-entrypoint-initdb.d
        - /path/to/cassandra-persistence:/bitnami
    

    裁判: https://hub.docker.com/r/bitnami/cassandra/