我启动了一个cassandra容器,在该容器上,我使用更新后的属性覆盖了cassandra.yaml文件:
authenticator: PasswordAuthenticator
代替
authenticator: AllowAllAuthenticator
这将允许我在新实例上创建新的超级用户。
现在,在此实例之后,我将创建一个名为cassandra-new的新映像,其中包含新的cassandra.yaml文件。因此,当我启动它时,它将使我可以为may cassandra db创建一个新角色。
问题在于我必须手动进入实例:
docker exec -it cassandra-new /bin/bash
然后我必须手动输入:
cqlsh -u cassandra -p cassandra
然后我可以编写我的脚本:
CREATE ROLE IF NOT EXISTS some WITH SUPERUSER = true AND LOGIN = true AND PASSWORD = 'supersome';
LIST ROLES;
如何在没有ENTRYPOINT的情况下自动执行此操作?(因为我已经尝试了2天,并且已经厌倦了它-无法正常工作) (请提供代码而不是文字,因为我是newby。)
Dockerfile是由shell脚本创建的:
if [[ ! -e Dockerfile ]]; then
touch Dockerfile
cat >> Dockerfile << EOF
FROM cassandra:latest
COPY cassandra.yaml cassandra:etc/cassandra/cassandra.yaml
EOF
fi
docker-entrypoint.sh未被更改-与cassandra最新镜像提供的默认设置相同。
答案 0 :(得分:1)
除非cassandra docker映像开发人员支持特殊的环境变量或某些作为其入口点自动运行的初始化脚本(例如,mysql具有一个用于安装.sql,.sh或.gz文件的文件夹,它将相应地执行它们),那么您确实需要自定义入口点,或者只需要手动执行此操作...
做到这一点的一种方法是启动cassandra容器并运行这些命令的简单脚本,但是取决于您的环境,可以是shell脚本或批处理脚本,因此这是一个自定义解决方案。
由于cassandra入口点可能是启动服务并执行初始化过程的唯一方法,因此,真正管理此服务的唯一方法就是自定义入口点。
答案 1 :(得分:0)
看看this gist,它显示了如何创建一个cassandra docker映像,该映像可以在启动时执行任何bash或cql脚本。
按照此要点,您可以简单地在容器内添加一个cql脚本,例如/docker-entrypoint-initdb.d/create_roles.cql
,内容如下:
CREATE ROLE IF NOT EXISTS some WITH SUPERUSER = true AND LOGIN = true AND PASSWORD = 'supersome';
LIST ROLES;
它将在启动时自动执行。