2015-02-24 20 views
6

में डेटाबेस स्कीमा प्रबंधित करने के लिए "सही" तरीका मैं जावा वेब एप्लिकेशन और एक पोस्टग्रेस्क्ल डेटाबेस युक्त एक ओपन सोर्स एप्लिकेशन विकसित कर रहा हूं। आदर्श रूप में यह परिनियोजन योग्य प्रक्रिया shipyard quickstart में विस्तृत करने के समान होगा:डॉकर

  1. एक ही डेटा-कंटेनर
  2. डीबी कंटेनर चलाने चलाने
  3. आवेदन कंटेनर

चलाने वहाँ एक सिफारिश की है डेटाबेस स्कीमा सेट अप करने के लिए समय? मैं डेटाबेस छवि के लिए डॉकरफाइल बनाने पर सोच रहा था, जब यह बनाया गया है तो स्कीमा बनाएं लेकिन पोस्टग्रेस इस समय स्पष्ट रूप से नहीं चल रहा है।

उत्तर

3

हम Postgres का उपयोग करें और डोकर जहां मैं काम करते हैं और हम क्या कर समाप्त हो गया है:

  1. आधिकारिक Postgres रेपो ताकि आप अपनी स्वयं की छवि बना सकते हैं से कॉपी Dockerfile।
  2. डॉकर-entrypoint.sh संशोधित करें (https://github.com/docker-library/postgres/blob/8f80834e934b7deaccabb7bf81876190d72800f8/9.4/docker-entrypoint.sh), जिसे कंटेनर शुरू होने पर कहा जाता है।

docker-entrypoint.sh के शीर्ष पर, मैं निम्नलिखित में डाल:

# Get the schema 
url=$(curl -s -u ${GIT_USER}:${GIT_PASSWORD} "${SQL_SCRIPT_URL}" | python -c 'import sys, json; print json.load(sys.stdin)["download_url"]') 
curl ${url} > db.sh 
chmod +x db.sh 
cp db.sh ./docker-entrypoint-initdb.d 

यह मूलतः कि डेटाबेस के लिए स्कीमा initializes Github से एक खोल स्क्रिप्ट डाउनलोड करता है। हम स्कीमा के संस्करणों को प्रबंधित करने के लिए ऐसा करते हैं, इसलिए जब आप अपना कंटेनर शुरू करते हैं तो आप यह बता सकते हैं कि एक एनएनवी चर के माध्यम से किस स्कीमा का उपयोग करना है।

कोड के बारे में कुछ नोट:

  1. हम उपयोगकर्ता प्रमाणिकता के बजाय एक निजी कुंजी का उपयोग कर Github से सामान को खींचने के लिए refactor करने के लिए की जरूरत है।
  2. ./docker-entrypoint-initdb.d निर्देशिका एक ऐसी जगह है जहां docker-entrypoint.sh डेटाबेस के लिए init स्क्रिप्ट चलाने के लिए देखेगा। आप फ़ाइलों को उस स्थान पर ले जा सकते हैं, हालांकि आप चाहते हैं। अगर गीथूब से डाउनलोड करना लागू नहीं है तो ऐसा करें।
+0

धन्यवाद। मुझे लगता है कि स्क्रिप्ट इस तरह से लिखी गई है कि इससे कोई फर्क नहीं पड़ता कि डेटाबेस पहले से ही बनाया गया है या नहीं? मैं इस बारे में सोच रहा हूं कि डीबी कंटेनर को पुनरारंभ करना था या नहीं। – stewartml

+0

हाँ यदि आप साझा वॉल्यूम्स के साथ होस्ट में डेटाबेस को जारी रखते हैं, तो जब आप इसे पुनरारंभ करते हैं तो आपको एक शिकायत मिल सकती है कि डेटाबेस पहले से मौजूद है। लेकिन तालिकाओं जैसी चीजों के लिए, यदि आप EXISTS का उपयोग नहीं कर सकते हैं, तो यह उतना शिकायत नहीं करता है। =) मुझे लगता है कि आप यह देखने के लिए डेटाबेस की क्वेरी करने के लिए बेहतर जांच भी कर सकते हैं कि ऑब्जेक्ट मौजूद हैं और यदि वे करते हैं, तो रोकें। – ryan1234