2017-06-20 1 views
0

Hier ist meine docker-compose.yaml:Populate cassandra nach Docker-compose beendet

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 

Und ein Shell-Skript bootstrap.sh zu starten:

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

Dies funktioniert und feuert auf den Stapel. Nun möchte Ich mag einen Schlüsselraum zu Cassandra, aber hinzufügen, unterhalb dieser Linie einen Fehler wirft:

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")})

Cassandra hat wahrscheinlich noch nicht initialisiert. Was ist ein guter Ansatz dafür?

Antwort

0

Wenn Sie versuchen, einen Befehl in Cassandra in Ihrem bootstrap.sh Skript direkt nach dem Starten der Container auszuführen, wird der Cassandra-Server nicht die Zeit haben, zu starten.

Eine einfache Lösung ein paar Sekunden in Ihrem Skript zu warten wäre, bevor der Befehl ausgeführt wird, unter Verwendung eines 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

Danke, tat es der Trick. Statt 30 Sekunden zu warten, ist es möglich, es ereignisbasiert zu machen? Wir haben keine Garantie, dass Cassandra nach 30 Sekunden bereit ist - es ist nur eine Annahme (wenn auch eine gute). – ChrisRich

+0

Ich habe meine Antwort aktualisiert, indem ich "sleep" durch eine "bis loop" ersetzt habe, die es mit jeder Bootdauer arbeiten lässt. – haradwaith