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

我想创build一个dockerfile,在图像开始的时候,已经在那里build立一个Cassandra图像,其中有一个keyspace和schema。

一般来说,你如何创build一个Dockerfile来构build一个包含一些步骤的图像,至less在第一次运行时才能真正完成。

现在,我有两个步骤:从现有的cassandra Dockerfile构buildcassandra映像,将具有CQL架构文件的卷映射到临时目录中,然后运行docker exec和cqlsh以在映像启动后导入架构容器。

但是,这不会创build一个模式的图像 – 只是一个容器。 该容器可以保存为图像,但这很麻烦。

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 compose这样的工具无法使用,因为链接的容器/服务也将启动,并期望模式到位。

我看到一个尝试,cassandra进程试图在Dockerfile的背景下在build中运行,然后运行cqlsh,但是我觉得这样做不太好。

好的,我有这个问题,有人build议我处理一些策略:

  1. 从现有的Cassandra Dockerfile开始,例如官方的Cassandra Dockerfile
  2. 删除ENTRYPOINT的东西
  3. 将模式(.cql)文件和数据(.csv)复制到映像中,并放在某处,例如/ opt / data
  4. 创build一个shell脚本,作为启动Cassandra的最后一个命令

    一个。 用$ CASSANDRA_HOME / bin / cassandra启动cassandra

    湾 如果有一个$ CASSANDRA_HOME / data / data / your_keyspace-xxxx文件夹,并且它不是空的,则不要做任何事情

    C。 其他

     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创buildVM映像更容易。