如何为包含模式的cassandra(或任何数据库)创建Dockerfile?

时间:2016-01-20 20:19:34

标签: docker cassandra

我想创建一个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,但我认为这不太合适。

3 个答案:

答案 0 :(得分:4)

好的,我有这个问题,有人建议我采取一些策略来处理:

  1. 从现有的Cassandra Dockerfile开始,例如官方的
  2. 删除ENTRYPOINT内容
  3. 将架构(.cql)文件和数据(.csv)复制到映像中并放在某处,例如/ opt / data
  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
    
  5. 我发现这个程序相当繁琐,但似乎没有别的办法。对于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,如果不存在(新环境,新部署)则创建它。

对于每个新表,自动创建表都可以在新数据实体(在其他开发人员本地,生产前,生产中)中运行时为新数据实体创建所需的新表。

所有这些代码都隔离在D​​ataDriver类中,以实现可移植性,以防万一我们将Cassandra更改为某些客户端或项目中的另一个DB。

这为管理员和开发人员避免了很多麻烦。 这种方法甚至适用于初始数据加载,我们在测试中使用了这种方法。