docker 创建scylladb容器时无法创建scyllaDB键空间和表

n6lpvg4x  于 2023-04-20  发布在  Docker
关注(0)|答案(1)|浏览(144)

我试图在创建scyllaDB容器时创建keyspace和table。为此,我创建了一个脚本文件'my_schema.sh':

CREATE KEYSPACE IF NOT EXISTS books_keyspace WITH replication = 
{'class':'SimpleStrategy','replication_factor':'1'};

CREATE TABLE IF NOT EXISTS books_keyspace.books
(
book_id int PRIMARY KEY, 
book_name text, 
genre text, 
price double, 
issue_date text, 
return_date text, 
fine double
)

然后我在docker-compose中添加以下内容作为入口点:

version: "3"

services:

  scyllaDB-node1:
    container_name: scyllaDB-node1
    image: scylladb/scylla:5.1.0
    restart: always
    command: --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
    entrypoint: ["/my_schema.sh"]
    volumes:
      - ./my_schema.sh:/my_schema.sh

但是当我运行这个命令时:

docker compose -f script-docker-compose.yaml up -d

docker exec -it scyllaDB-node1 nodetool status

它给出以下错误:

Error response from daemon: Container 44b7e04d61917444ceaaaec9135891c66355dffbf1b5f39c352f465db85ea08e is restarting, wait until the container is running

在检查日志时:

docker logs scyllaDB-node1 

Creating keyspace and table...
/my_schema.sh: line 11: CREATE: command not found
/my_schema.sh: line 12: class:SimpleStrategy: command not found
/my_schema.sh: line 14: CREATE: command not found
/my_schema.sh: line 16: book_id: command not found
/my_schema.sh: line 17: book_name: command not found
/my_schema.sh: line 18: genre: command not found
/my_schema.sh: line 19: price: command not found
/my_schema.sh: line 20: issue_date: command not found
/my_schema.sh: line 21: return_date: command not found
/my_schema.sh: line 22: fine: command not found

请帮助我,我如何使keyspace和表,同时创建容器在docker-compose。任何帮助是感激的。

omjgkv6w

omjgkv6w1#

你的方法有几个问题。
首先,您提供的不是脚本,而是CQL语句。您希望使用cqlsh-e-f标志来执行这些语句。
-e将接受常规CQL语句;而-f将接受从中读取CQL语句的文件
你的方法的第二个问题是,你正在将所讨论的 script(正如我们在上面的指针中看到的,它实际上不是一个脚本)定义为容器入口点。这意味着一旦你的脚本完成,容器就会死亡,并且当你使用docker-compose时,它会尝试重新启动它。
一般来说,你不想覆盖入口点。ScyllaDB容器默认使用 supervisord 作为入口点,这使得它很容易定制。
因此,定义容器启动时要执行的程序的正确方法是将supervisord服务定义放在/etc/supervisord.conf.d文件夹下,然后调用所需的脚本或程序。
然而,这种方法带来了第三个问题:每次服务启动时都会执行服务的事实。这通常可能不是问题,但在您的情况下可能会有问题,特别是当您运行分布式数据库时。
因此,自动化模式创建的正确方法应该是从应用程序的Angular ,特别是要看看模式迁移工具(例如gocqlx migratecassandra-migrate),它们正是为此目的而设计的。

相关问题