用cassandra在docker容器中自动创建键空间

uqzxnwby  于 2021-06-10  发布在  Cassandra
关注(0)|答案(5)|浏览(676)

我想知道是否有人试图建立一个默认键空间Cassandradocker形象,我曾试图这样做的建设时间,但它没有工作,因为Cassandra是没有在该阶段运行。类似于这样:

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

我的新方法是从entrypoint脚本开始,但是,如果其他人有更好的想法,我现在就想这么做。
快乐航运:d

mkshixfv

mkshixfv1#

我觉得有趣的是,还没有人对此作出回应。你可以理解mysql是在一个容器中运行的。
请参阅此链接:http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/
放入该目录中的任何脚本都将通过/entrypoint.sh脚本执行。看起来cassandra的entrypoint.sh脚本还不支持这个。然而!它可以!

lsmepo6l

lsmepo6l2#

今天解决了这个问题。生成图像,覆盖默认的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

将图像中所需的*.cql放入 `docker-entrypoint-initdb.d/` .
映像将启动,启动cassandra,并重试插入数据库,除非成功。确保你的剧本 `IF NOT EXISTS` 否则脚本将无限期运行。
wnavrhmk

wnavrhmk3#

我用这个做决定。我从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的形象。

yvt65v4c

yvt65v4c4#

我正在使用一个spring boot docker容器来访问我的cassandra容器。一切都是由一个dockr组成的。本教程结合以下代码对我很有用。

@Override
protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
    CreateKeyspaceSpecification specification = CreateKeyspaceSpecification.createKeyspace(KEYSPACE);

    return Arrays.asList(specification);
}
9rbhqvlz

9rbhqvlz5#

基于@jan oudrincy和@alexander morozov的答案,我构建了一个新的docker映像,它有一个原始的 Package 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"]

入口点 Package .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 "$@"

相关问题