在Docker-compose完成之后填充cassandra

这是我docker-compose.yaml

 version: '3' services: cassandra: container_name: cassandra image: cassandra:3.10 ports: - 9142:9042 volumes: - $PWD/src/database/migrations:/migrations depends_on: - mysql mysql: image: mysql:5.7 volumes: - ./src/database/migrations:/docker-entrypoint-initdb.d ports: - 3307:3306 restart: always environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=leonardo - MYSQL_ALLOW_EMPTY_PASSWORD=1 

和一个shell脚本bootstrap.sh启动:

 #!/bin/bash set -e docker-compose -f $PWD/docker-compose.yaml down docker-compose -f $PWD/docker-compose.yaml up -d 

这是工作,并启动堆栈。 现在我想给Cassandra添加一个密钥空间,但是在这行下面会抛出一个错误:

 docker-compose -f $PWD/docker-compose.yaml exec cassandra /bin/sh -c $'cqlsh cassandra -e "CREATE KEYSPACE mykeyspace WITH replication = {\'class\': \'SimpleStrategy\', \'replication_factor\': \'1\'} AND durable_writes = true;"' 

连接错误:('无法连接到任何服务器',{'172.18.0.2':错误(111,“尝试连接到[('172.18.0.2',9042)]最后一个错误:连接被拒绝”)})

卡桑德拉可能还没有初始化。 这是什么方法?

如果尝试在启动容器后在bootstrap.sh脚本中执行Cassandra中的命令,则Cassandra服务器将没有时间启动。

一个简单的解决scheme是在执行命令之前,在脚本中等待几秒钟,使用until循环 :

 #!/bin/bash set -e docker-compose -f $PWD/docker-compose.yaml down docker-compose -f $PWD/docker-compose.yaml up -d until docker-compose -f $PWD/docker-compose.yaml exec cassandra /bin/sh -c "cqlsh cassandra -e 'show version'"; do docker-compose -f $PWD/docker-compose.yaml exec cassandra /bin/sh -c $'cqlsh cassandra -e "CREATE KEYSPACE mykeyspace WITH replication = {\'class\': \'SimpleStrategy\', \'replication_factor\': \'1\'} AND durable_writes = true;"' done