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

Create keyspace automatically inside docker container with cassandra

我想知道是否有人尝试使用默认键空间构建一个 cassandra docker 图像,我尝试在 BUILD 时间这样做但是它不起作用,因为 cassandra 不是 [=19= 】 在那个阶段。类似于:

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

我的新方法是从入口点脚本开始,但是,如果其他人有更好的主意,我现在就想这样做。

发货愉快:D

有趣的是还没有人对此做出回应。您可以按照我认为的容器中的 MySQL 运行 进行操作。

参考这个link: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

然后有必要重建docker图像。

今天解决了这个问题。构建图像,它覆盖默认的 Cassandra docker-entrypoint.sh,并在 exec "$@"

之前修改、附加一个
for f in docker-entrypoint-initdb.d/*; do
    case "$f" in
        *.sh)     echo "[=10=]: running $f"; . "$f" ;;
        *.cql)    echo "[=10=]: running $f" && until cqlsh -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;;
        *)        echo "[=10=]: ignoring $f" ;;
    esac
    echo
done

将需要的*.cql放在docker-entrypoint-initdb.d/的图片中。

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

根据@jan-oudrincky 和@alexander-morozov 的回答,我构建了一个新的docker 图像,它有一个原始docker-entrypoint.sh 的包装器,用于在环境变量[=13= 时创建键空间] 已设置。它将在 dev/test 环境中很有用。

它不会修改 docker-entrypoint.sh 所以即使 cassandra 基础镜像有任何修改你只需要重建。

Docker 文件

FROM cassandra

COPY entrypoint-wrap.sh /entrypoint-wrap.sh
ENTRYPOINT ["/entrypoint-wrap.sh"]
CMD ["cassandra", "-f"]

入口点-wrap.sh

#!/bin/bash

if [[ ! -z "$CASSANDRA_KEYSPACE" &&  = '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 "$@"

我正在使用 Spring-Boot docker 容器来访问我的 cassandra 容器。一切都由 dockr-compose 精心策划。 this tutorial 结合以下代码对我有用。

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

    return Arrays.asList(specification);
}