2015-08-27 10 views
10

के साथ डॉकर कंटेनर के अंदर स्वचालित रूप से कुंजीपटल बनाएं, मैं सोच रहा था कि किसी ने डिफ़ॉल्ट कुंजीपटल के साथ कैसंड्रा डॉकर छवि बनाने की कोशिश की है, मैंने इसे समय पर करने की कोशिश की है लेकिन यह काम नहीं करता है क्योंकि कैसंड्रा नहीं चल रहा है वह चरण यह इस के लिए कुछ इसी तरह था:कैसंड्रा

FROM cassandra:2.0 
COPY ../somewhere/keyspace_definition.txt /src/keyspace_definition.txt 
RUN /usr/bin/cqlsh -f /src/keyspace_definition.txt 

मेरा नया दृष्टिकोण entrypoint स्क्रिप्ट से यह करने के लिए होगा, लेकिन, अब मैं चाहता था अगर किसी एक बेहतर विचार है।

मुबारक शिपिंग: डी

+0

मैं BUILD चरण पर एक प्रवास स्क्रिप्ट को कॉपी करने और अध्यक्ष एवं प्रबंध निदेशक के हिस्से के रूप में यह चल रहा है, यह 'अध्यक्ष एवं प्रबंध निदेशक migration.sh तरह समाप्त हो गया && cassandra -f', जिस तरह से यह माइग्रेशन स्क्रिप्ट पृष्ठभूमि कार्य के रूप में चलता है और कैसंड्रा शुरू होने तक मनमाने ढंग से समय की प्रतीक्षा करता है। – jossemarGT

उत्तर

6

आज इस समस्या को हल किया। बिल्ड छवि, जो डिफ़ॉल्ट रूप कैसेंड्रा एक संशोधित, संलग्न docker-entrypoint.sh, अधिलेखित कर देता है ठीक पहले exec "[email protected]"

for f in docker-entrypoint-initdb.d/*; do 
    case "$f" in 
     *.sh)  echo "$0: running $f"; . "$f" ;; 
     *.cql) echo "$0: running $f" && until cqlsh -f "$f"; do >&2 echo "Cassandra is unavailable - sleeping"; sleep 2; done & ;; 
     *)  echo "$0: ignoring $f" ;; 
    esac 
    echo 
done 

docker-entrypoint-initdb.d/ में छवि में वांछित * .cql रखो।

छवि शुरू हो जाएगी, कैसंड्रा को बूट करें, और जब तक यह सफल न हो जाए तब तक डेटाबेस में डालने की रीट्रीज़। बस सुनिश्चित करें कि आपकी स्क्रिप्ट IF NOT EXISTS हैं अन्यथा स्क्रिप्ट अनिश्चित काल तक चली जाएगी।

+0

यह एक चालाक समाधान है! मैं इस प्रश्न को पोस्ट करने के कुछ महीनों बाद जोड़ना चाहता हूं, मुझे इसे करने का एक और तरीका मिला, निर्माण समय पर डेटाबेस शुरू करके, एक विशाल नींद के समय के बाद, उसके बाद माइग्रेशन चलाएं और अंत में डेटाबेस को अंत में बंद कर दें। – jossemarGT

1

मैं यह दिलचस्प है कि कोई भी अभी तक इस पर प्रतिक्रिया व्यक्त पाते हैं। आप उनका पालन कर सकते हैं कि उन्होंने MySQL के साथ एक कंटेनर में चल रहा था।

इस लिंक को देखें: http://www.luiselizondo.net/a-tutorial-on-how-to-use-mysql-with-docker/

किसी भी स्क्रिप्ट आप उस निर्देशिका में डाल /entrypoint.sh स्क्रिप्ट के माध्यम से क्रियान्वित की जाएगी। ऐसा लगता है कि कैसंड्रा की entrypoint.sh स्क्रिप्ट अभी तक इसका समर्थन नहीं करती है। तथापि! यह हो सकता है!

0

मैंने इन निर्णयों का उपयोग किया। मैं फ़ाइल docker-entrypoint.sh से अंतिम पंक्ति को नष्ट कर दिया और अंत में डाला उन पंक्तियों:

exec "[email protected]" > /dev/null & 
sleep 30 && echo "CREATE KEYSPACE <YOUR_KEYSAPCE> WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" | cqlsh > /dev/null && tail -n 10000 -f /var/log/cassandra/system.log 

तो यह डोकर छवि के पुनर्निर्माण के लिए आवश्यक है।

2

@ jan-oudrincky और @ alexander-morozov के उत्तरों पर आधार, मैं एक नई डॉकर छवि बनाता हूं जिसमें मूल सेट होने पर कुंजीपटल बनाने के लिए मूल docker-entrypoint.sh का रैपर होता है। यह देव/परीक्षण पर्यावरण में उपयोगी होगा।

यह docker-entrypoint.sh को संशोधित नहीं करता है, भले ही कैसंड्रा बेस छवि में कोई संशोधन हो, आपको केवल पुनर्निर्माण की आवश्यकता है।

Dockerfile

FROM cassandra 

COPY entrypoint-wrap.sh /entrypoint-wrap.sh 
ENTRYPOINT ["/entrypoint-wrap.sh"] 
CMD ["cassandra", "-f"] 

entrypoint-wrap.sh

#!/bin/bash 

if [[ ! -z "$CASSANDRA_KEYSPACE" && $1 = 'cassandra' ]]; then 
    # Create default keyspace for single node cluster 
    CQL="CREATE KEYSPACE $CASSANDRA_KEYSPACE WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': 1};" 
    until echo $CQL | cqlsh; do 
    echo "cqlsh: Cassandra is unavailable - retry later" 
    sleep 2 
    done & 
fi 

exec /docker-entrypoint.sh "[email protected]"