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