2017-06-20 46 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