2017-06-20 44 views
0

这里是我的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 

这是工作和火灾堆栈。 现在我想一个密钥空间添加到卡桑德拉,不过,下面这行抛出一个错误:

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;"' 

Connection error: ('Unable to connect to any servers', {'172.18.0.2': error(111, "Tried connecting to [('172.18.0.2', 9042)]. Last error: Connection refused")})

卡桑德拉恐怕还没有初始化。 这有什么好方法?

回答

0

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

简单的解决办法是在执行命令,使用until loop之前等待你的脚本几秒钟:

#!/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 
+0

谢谢,它的伎俩。而不是等待30秒,是否有可能使其基于事件?我们无法保证Cassandra在30秒后准备就绪 - 这只是一个假设(尽管是一个很好的假设)。 – ChrisRich

+0

我更新了我的答案,用“直到循环”替换“睡眠”,这使得它可以在任何启动时间内工作。 – haradwaith