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

时间:2015-08-27 16:08:32

标签: docker cassandra-2.0 dockerhub

我想知道是否有人尝试使用默认密钥空间构建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

5 个答案:

答案 0 :(得分:8)

基于@ jan-oudrincky和@ 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"]

entrypoint-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 "$@"

答案 1 :(得分:6)

今天解决了这个问题。构建图像,在if(current != null) { while(current.getNext() != null) { current = current.getNext(); } current.setNext(new Node<T>(newElt)); } else { current = new Node<T>(newElt, null); // because current is start }

之前覆盖默认的Cassandra docker-entrypoint.sh,并附加一个修改后的附加内容
exec "$@"

将所需的* .cql放在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 中的图片中。

图像将启动,启动cassandra,并重试插入数据库,除非成功。只需确保您的脚本为docker-entrypoint-initdb.d/,否则脚本将无限期运行。

答案 2 :(得分:1)

我觉得有趣的是没有人对此做出回应。您可以按照他们在我想要的容器中运行MySQL的方式进行操作。

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

您放在该目录中的任何脚本都将通过/entrypoint.sh脚本执行。看起来像Cassandra的entrypoint.sh脚本还不支持这个。然而!它可以!

答案 3 :(得分:1)

我正在使用Spring-Boot docker容器访问我的cassandra容器。一切都是由接驳组成的。 this tutorial  结合以下代码为我工作。

false

答案 4 :(得分:0)

我用过这个决定。我从文件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镜像。