2014-04-03 8 views
48

मेरे पास मेरे कंटेनर में /srv के तहत मेरी सभी वेबसाइटों का कोड है।विकास में डॉकर कंटेनर में कोड कैसे संपादित करें?

मेरा डॉकरफ़ाइल गिट का उपयोग करके कोड डाउनलोड करता है और इसे उत्पादन के लिए आसान तैनाती के लिए छवि का हिस्सा बनाता है।

लेकिन फिर मैं विकास में कोड कैसे संपादित करूं? मैंने सोचा कि वॉल्यूम का उपयोग समाधान था, उदाहरण के लिए: -v /docker/mycontainer/srv:/srv। लेकिन यह कंटेनर में निर्देशिका को ओवरराइट करता है। अगर यह पहली बार है कि मैं इसे चलाता हूं तो यह खाली हो जाता है क्योंकि मेजबान में कुछ भी नहीं है। तो जो भी मैंने डॉकरफाइल में किया था वह खो गया था।

/srv/myapp के अंदर निर्देशिका और फ़ाइलें भी हैं जिन्हें मैं अपने ऐप के विभिन्न संस्करणों में साझा करना चाहता हूं, उदाहरण के लिए: /srv/myapp/user-uploads। पेशेवर वेब विकास में यह common practice है।

तो क्या मैं विकास में इन सब बातों ?:/SRV में

  • संपादित कोड करने के लिए सक्षम होने के लिए क्या कर सकते हैं
  • शेयर/SRV/MyApp विभिन्न संस्करणों के पार/उपयोगकर्ता के अपलोड
  • डॉकरफाइल कोड डाउनलोड करने दें। डॉकर के बाहर "गिट क्लोन" या "गिट पुल" करना मेरी राय में डॉकर के उद्देश्य को हरा देगा। इसके अलावा ऐसी चीजें हैं जिन्हें मैं मेजबान में नहीं चला सकता, जैसे डेटाबेस माइग्रेशन या अन्य ऐप-विशिष्ट स्क्रिप्ट्स।

क्या रिवर्स वॉल्यूम माउंट करने का कोई तरीका है? मेरा मतलब है कि कंटेनर विपरीत के बजाए मेजबान को ओवरराइट करें।

मुझे लगता है कि कंटेनर के डिमन को चलाने से पहले एक soluiton /sv /srv.deployment-copy पर कॉपी/srv हो सकता है। और फिर जब मैं डिमन जांच चलाता हूं तो /srv.deployment-copy मौजूद है और सबकुछ वापस/srv पर कॉपी करें। इस तरह मैं वॉल्यूम के रूप में/srv का उपयोग कर सकता हूं और अभी भी डॉकरफ़ाइल के साथ कोड को तैनात करने में सक्षम हूं। मैं पहले से ही सभी डॉकर कमांड के लिए उपनाम का उपयोग कर रहा हूं इसलिए इसे स्वचालित करना कोई समस्या नहीं होगी। तुम क्या सोचते हो?

+0

वेब ऐप फ़ोल्डर में उपयोगकर्ता डेटा संग्रहीत करना बिल्कुल सामान्य अभ्यास नहीं है। यह सब कुछ जटिल कारण के साथ जटिल बनाता है। – rightfold

+1

हां गिट क्लोन और डॉकर के बाहर गिट खींचना पूरी तरह से सामान्य है। मैं ऐसा करता हूं। कंटेनर बस एक कंटेनर है। ऐप कोड बदलता है और एक अलग रेपो में रखा जाता है। माइग्रेशन और अन्य ऐप विशिष्ट कमांड आसानी से exec कमांड का उपयोग करके चलाया जा सकता है जो आपको चल रहे कंटेनर में कमांड चलाने की अनुमति देता है। – Kevin

उत्तर

9

मैं सबसे अच्छा तरीका है संपादित करने के लिए विकास में कोड हमेशा की तरह (यदि आपके ऐप की भंडार क्लोनिंग सहित) सब कुछ स्थापित है पाया है, लेकिन कंटेनर में सभी कोड के लिए कदम /srv/myapp.deploy.dev कहने के लिए।

rm -r /srv/myapp/* 
rm -r /srv/myapp/.[!.]* 
cp -r /srv/myapp.deploy.dev/. /srv/myapp 
rm -r /srv/myapp.deploy.dev 
+4

मैं एक ही समस्या पर ठोकर खा रहा हूं, ऐसा लगता है कि आपने इसे हल कर लिया है लेकिन मैं स्पष्ट नहीं हूं कि आप क्या कर रहे हैं। क्या आप अपने डॉकरफाइल (छवि निर्माण समय पर) में कुछ स्टार्टअप स्क्रिप्ट्स (कंटेनर निर्माण समय पर) में क्या किया जा रहा है, इसके साथ आपके उत्तर का विस्तार कर सकते हैं? – user779159

+3

@ user779159 मुझे खेद है कि मैं महीनों से साइट से दूर हूं। मैं यहां क्या कर रहा हूं, वॉल्यूम बनाने से पहले कोड को कहीं और ले जा रहा है, फिर मैं वॉल्यूम बनाउंगा (अगर यह पहली बार होगा, या पुराने कोड के साथ खाली होगा), तो वॉल्यूम में सब कुछ हटाएं (मामले में इसमें पुराना कोड है), और फिर मैं इसमें नया कोड ले जाता हूं। तो अब मेरे पास एक नया वॉल्यूम वॉल्यूम में बैठा है, इसलिए मैं इसे बाहर से संपादित कर सकता हूं। – ChocoDeveloper

1

मान लें कि गिट कंटेनर का प्रवेश बिंदु नहीं है, अगर आपके डॉकर कंटेनर में गिट स्थापित है तो आप कंटेनर में एसएसएच कर सकते हैं और git clone/git pull चला सकते हैं। मेजबान के साथ वॉल्यूम साझा करने के तरीके के कारण, कंटेनर से फ़ाइलों में किए गए परिवर्तन मेजबान को भी बनाए जाएंगे (वास्तव में यह वही फाइलें हैं)।

Here कुछ स्पष्टीकरण है कि कैसे एक कंटेनर में जल्दी से ssh करने के लिए।

+4

मैं कंटेनर में एसएसएच कर सकता हूं, लेकिन ऐसा कर रहा हूं (कंटेनर बनाने के बाद * गिट खींच रहा है) मेरी राय में डॉकर का उद्देश्य (या कम से कम इसका आधा) हार जाता है। मैं छवि को स्वयं निहित पैकेज के रूप में तैनात करने में सक्षम होना चाहता हूं। छवि को तैनात करने के बाद खींचने वाला गिट कोई समझ नहीं आता है। मैं पुनरुत्पादन, अपरिवर्तनीयता, आसानी से रोलबैक करने की क्षमता भी खो दूंगा। गिट पुल ऐसी चीज है जो यादृच्छिक कारणों से असफल हो सकती है, और डॉकर का उपयोग करने के लिए इसे ठीक करना था। – ChocoDeveloper

+1

मैं 100% सहमत हूं। मेरे पास और अंतर्दृष्टि नहीं है। –

+0

मैंने अपना उत्तर पोस्ट किया, आपको यह उपयोगी लगेगा। – ChocoDeveloper

5

नोट: -v के साथ निर्देशिका होस्ट करने के लिए कंटेनर निर्देशिका माउंट नहीं कर सकता।

मुझे नहीं लगता कि आपको mangle/srv और /srv.deployment-copy की आवश्यकता है। यदि आप

मुझे लगता है कि:

  • आप लगातार/साझा डेटा के लिए मात्रा का उपयोग करना चाहिए: -v /hostdir/user-uploads:/srv/myapp/user-uploads, या आप data volume container अवधारणा का उपयोग कर सकते हैं। आप इस पर एक फाइल सिस्टम समर्थित डेटाबेस पर होस्ट कर सकते हैं जो होस्ट (डेटा केवल कंटेनर) पर संग्रहीत है और कंटेनर को -v द्वारा इसका उपयोग करने की अनुमति है।

  • आप सही कर रहे हैं: उत्पादन तैनाती के लिए - यदि आप स्रोत कोड (git clone) के साथ छवि का निर्माण कर सकते हैं, तो आप हर रिहाई के लिए एक छवि का निर्माण। उत्पादन में स्रोत कोड को संपादित करने की आवश्यकता नहीं होनी चाहिए।

  • विकास पर्यावरण - आपको स्रोत कोड के बिना छवि बनाना चाहिए या आप तैनाती/विकास के लिए एक ही छवि का उपयोग करने के मामले में वॉल्यूम के साथ स्रोत कोड निर्देशिका को छाया कर सकते हैं। फिर स्थानीय रूप से क्लोन स्रोत कोड गिट करें और कंटेनर के साथ स्रोत कोड साझा करने के लिए वॉल्यूम -v /hostdir/project/src:/srv/project का उपयोग करें। अधिमानतः आपको स्रोत कोड केवल पढ़ने के लिए (:ro अंत में) साझा करना चाहिए और किसी भी अस्थायी या मध्यवर्ती फ़ाइलों को कंटेनर में कहीं और संग्रहीत किया जाना चाहिए। सेवा शुरू होने से पहले, मेरे पास कंटेनर स्टार्ट पर निष्पादित स्क्रिप्ट (डेटा माइग्रेशन, कुछ इंडेक्स/कैश डेटा फाइलों का पुनर्निर्माण आदि) है। तो जब भी मुझे लगता है मुझे ताजा re-init की आवश्यकता है, तो मैं सिर्फ देव कंटेनर को मार डालता हूं और इसे फिर से चलाता हूं। या, मैं पुराने कंटेनर को नहीं रोकता - मैं बस एक और चलाता हूं।

10

एक और तरीका है एक और कंटेनर से मात्रा के साथ कंटेनर शुरू करने के लिए नहीं है: तो फिर /srv/myapp के लिए एक rw मात्रा है, और एक init.d स्क्रिप्ट है कि मात्रा और प्रतियां इस तरह के अंदर नई सामग्री साफ साथ कंटेनर शुरू:

https://docs.docker.com/userguide/dockervolumes/
बनाना और एक डाटा खंड कंटेनर

बढ़ते आप कुछ लगातार डेटा कि y है पर देखो कहां कंटेनरों के बीच साझा करना चाहते हैं, या गैर-लगातार कंटेनरों से उपयोग करना चाहते हैं, नामित डेटा वॉल्यूम कंटेनर बनाने के लिए सबसे अच्छा है, और उसके बाद डेटा को माउंट करना सबसे अच्छा है।

चलो साझा करने के लिए वॉल्यूम के साथ एक नया नाम कंटेनर बनाएं।

$ sudo docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres 

फिर आप ध्वज से -वॉल्यूम का उपयोग किसी अन्य कंटेनर में/dbdata वॉल्यूम को माउंट करने के लिए कर सकते हैं।

$ sudo docker run -d --volumes-from dbdata --name db1 training/postgres 

और एक और:

$ sudo docker run -d --volumes-from dbdata --name db2 training/postgres 

एक और उपयोगी समारोह हम संस्करणों के साथ प्रदर्शन कर सकते हैं, बैकअप के लिए उन्हें इस्तेमाल है पुनर्स्थापित करता है या माइग्रेशन।

$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata 

=============

मैं: हम एक नए कंटेनर है कि उस मात्रा mounts बनाने इसलिए की तरह करने के लिए --volumes-से ध्वज का उपयोग करके ऐसा लगता है कि आपको अपनी मेजबान निर्देशिका को एक कंटेनर में घुमाने का उपयोग नहीं करना चाहिए। लेकिन आप वॉल्यूम का उपयोग अपनी सभी शक्तियों के साथ कर सकते हैं। आप अपने संपादकों और उपकरणों के सही सेट के साथ अन्य कंटेनर का उपयोग करके वॉल्यूम्स में फ़ाइलों को संपादित कर सकते हैं। और कंटेनर यह आपका ऐप ओवरहेड के बिना साफ हो जाएगा।

संरचना है:
-) कंटेनर ऐप्लिकेशन डेटा के लिए
docker run -d -v /data --name data
-) कंटेनर एप्लिकेशन binaries के लिए
docker run -d --volumes-from data --name app1
-) कंटेनर संपादकों और विकास के लिए उपयोगिताओं के लिए
docker run -d --volumes-from data --name editor

5

मैं एक पाया बस गिट का उपयोग करके ऐसा करने का अच्छा तरीका:

CONTAINER=my_container 
SYNC_REPO=/tmp/my.git 
CODE=/var/www 

#create bare repo in container 
docker exec $CONTAINER git init --bare $SYNC_REPO 

#add executable syncing hook that checks out into code dir in container 
printf "#!/bin/sh\nGIT_WORK_TREE=$CODE git checkout -f\n" | \ 
docker exec -i $CONTAINER bash -c "tee $SYNC_REPO/hooks/post-receive;chmod +x \$_" 

#use git-remote-helper to use docker exec instead of ssh for git 
git remote add docker "ext::docker exec -i $CONTAINER sh -c %S% $SYNC_REPO" 

#push updated local code into docker 
git push docker master 

मानता है कि आपके पास कोड के साथ स्थानीय गिट है। गिट को कंटेनर में स्थापित करने की जरूरत है। वैकल्पिक रूप से आप शायद docker run और गिट स्थापित के साथ साझा मात्रा वाले डेटा कंटेनर का उपयोग कर सकते हैं।

संबंधित मुद्दे