2015-08-27 42 views
10

我想知道是否有人试图用默认密钥空间构建cassandra docker图像,我试图在BUILD时做它,但它不起作用,因为cassandra没有运行那个阶段。这是类似于此:使用cassandra在Docker容器中自动创建keyspace

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

我的新方法将是从入口点脚本做到这一点,但是,我想现在如果别人有更好的主意。

快乐送货:D

+0

我结束了在构建阶段复制迁移脚本并运行它作为CMD的一部分,这样'CMD migration.sh && cassandra -f',顺便说一下,这个迁移脚本作为后台任务运行,并等待一段时间,直到cassandra启动。 – jossemarGT

回答

6

今天解决了这个问题。前exec "[email protected]"

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 

右建立图像,这将覆盖默认卡桑德拉docker-entrypoint.sh与一种修改,追加,将所需* .cql在图像中docker-entrypoint-initdb.d/

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

+0

这是一个聪明的解决方案!我想补充说,在发布这个问题之后的几个月里,我发现了另一种方法来实现它,通过在构建时启动数据库,然后运行大量的休眠时间,然后在它之后运行迁移并最终停止数据库。 – jossemarGT

1

我觉得有趣的是,没有人回应这个呢。你可以按照他们所做的那样,MySQL在运行一个我认为是容器的MySQL。

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

你把目录中的所有脚本将通过/entrypoint.sh脚本来执行。看起来像Cassandra的entrypoint.sh脚本还不支持。然而!它可以!

0

我使用了这个决定。我删除最后一行从文件docker-entrypoint.sh并最终插入这些行:

exec "[email protected]" > /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 

然后,它需要重建码头工人的形象。

2

根据@ jan-oudrincky和@ alexander-morozov的回答,我建立了一个新的码头图像,其中包含原始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 "[email protected]" 
相关问题