使用 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);
}
我想知道是否有人尝试使用默认键空间构建一个 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);
}