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

jos*_*rGT 14 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
Run Code Online (Sandbox Code Playgroud)

我的新方法是从入口点脚本中做到这一点,但是,如果其他人有更好的想法,我现在想要.

发货快乐:D

ale*_*ung 10

根据@ 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"]
Run Code Online (Sandbox Code Playgroud)

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 "$@"
Run Code Online (Sandbox Code Playgroud)


小智 7

今天解决了这个问题.构建映像,它覆盖默认的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
Run Code Online (Sandbox Code Playgroud)

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

图像将启动,启动cassandra,并重试插入数据库,除非成功.只要确保你的脚本是IF NOT EXISTS脚本将无限期运行.