自动在docker容器中用cassandra创buildkeyspace

我想知道是否有人试图build立一个cassandra泊坞窗图像与默认密钥空间,我试图做的时间,但它不工作,因为cassandra没有运行在这个阶段。 这是类似的东西:

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

我的新方法是从切入点脚本来做,但是,如果别人有更好的主意,我想现在。

祝您运送愉快:D

今天解决了这个问题。 构build映像,它将在exec "$@"之前用一个修改后的附加内容覆盖默认的Cassandra docker-entrypoint.sh

 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 docker-entrypoint-initdb.d/中的图像中。

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

我觉得有趣的是没有人回应。 你可以按照他们所做的MySQL在一个容器中运行。

参考这个链接: http : //www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

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

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

那么有必要重builddocker镜像。

根据@ jan-oudrincky和@ alexander-morozov的回答,我build立了一个新的docker镜像,它有一个原始docker-entrypoint.sh的包装,当设置环境variablesCASSANDRA_KEYSPACE时创builddocker-entrypoint.sh 。 这在开发/testing环境中会很有用。

它不会修改docker-entrypoint.sh所以即使cassandra基本映像有任何修改,你只需要重build。

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