我想创建一个dockerfile,它可以在图像开始时使用键空间和模式构建Cassandra图像。
一般来说,如何创建一个Dockerfile,它将构建一个包含一些步骤的图像,这些步骤在容器运行之前真的要完成,至少是第一次?
现在,我有两个步骤:从现有的cassandra Dockerfile构建cassandra映像,该文件将带有CQL模式文件的卷映射到临时目录,然后使用cqlsh运行docker exec以在映像完成后导入模式以容器开始。
但是,这并没有使用架构创建一个图像 - 只是一个容器。该容器可以保存为图像,但这很麻烦。
docker run --name $CASSANDRA_NAME -d \
-h $CASSANDRA_NAME \
-v $CASSANDRA_DATA_DIR:/data \
-v $CASSANDRA_DIR/target:/tmp/schema \
tobert/cassandra:2.1.7
然后
docker exec $CASSANDRA_NAME cqlsh -f /tmp/schema/create_keyspace.cql
docker exec $CASSANDRA_NAME cqlsh -f /tmp/schema/schema01.cql
# etc
这很有效,但它使得无法使用像Docker这样的工具,因为链接的容器/服务也会启动并期望架构到位。
我看到一次尝试尝试在构建期间在Dockerfile的后台启动cassandra进程,然后运行cqlsh,但我认为这不太合适。
答案 0 :(得分:4)
好的,我有这个问题,有人建议我采取一些策略来处理:
创建一个shell脚本,用作启动Cassandra的最后一个命令
一个。用$ CASSANDRA_HOME / bin / cassandra
启动cassandra湾如果有一个$ CASSANDRA_HOME / data / data / your_keyspace-xxxx文件夹并且它不是空的,则不再执行任何操作
℃。其他
1. sleep some time to allow the server to listen on port 9042
2. when port 9042 is listening, execute the .cql script to load csv files
我发现这个程序相当繁琐,但似乎没有别的办法。对于Cassandra动手实验室,我发现使用Vagrant和Ansible创建VM映像更容易。
答案 1 :(得分:0)
制作dockerfile Dockerfile_CAS:
从cassandra:latest
复制ddl.cql docker-entrypoint-initdb.d /
复制docker-entrypoint.sh /docker-entrypoint.sh
运行ls -la * .sh; chmod + x * .sh; ls -la * .sh
ENTRYPOINT [“ /docker-entrypoint.sh”]
CMD [“ cassandra”,“ -f”]
编辑docker-entrypoint.sh,添加
对于docker-entrypoint-initdb.d / *中的f;做 案例“ $ f”在 * .sh)echo“ $ 0:running $ f”; 。 “ $ f” ;; * .cql)echo“ $ 0:running $ f” &&直到cqlsh -f“ $ f”; >> 2 echo“ Cassandra不可用-睡觉”;睡2;完成&;; *)echo“ $ 0:忽略$ f” ;; 埃萨克 回声 完成
高管“ $ @”上方
docker build -t suraj1287 / cassandra -f Dockerfile_CAS。
并重建图像...
答案 2 :(得分:0)
我们团队使用的另一种方法是在服务器init上创建架构。 我们的Java代码测试是否存在 SCHEMA,如果不存在(新环境,新部署)则创建它。
对于每个新表,自动创建表都可以在新数据实体(在其他开发人员本地,生产前,生产中)中运行时为新数据实体创建所需的新表。
所有这些代码都隔离在DataDriver类中,以实现可移植性,以防万一我们将Cassandra更改为某些客户端或项目中的另一个DB。
这为管理员和开发人员避免了很多麻烦。 这种方法甚至适用于初始数据加载,我们在测试中使用了这种方法。