2015-04-09 4 views
7

मैं लोचदार Beanstalk का उपयोग कर AWS के लिए एक Django परियोजना तैनात कर रहा हूँ और डेटाबेस माइग्रेट करने पर अटक गया हूँ।Django AWS लोचदार Beanstalk डेटाबेस माइग्रेट

जहां मैं हूं: मैं सफलतापूर्वक अपने django प्रोजेक्ट को तैनात करने और mysubdomain.elasticbeanstalk.com के माध्यम से पृष्ठ लोड करने में सक्षम हूं। पेज त्रुटि के बिना लोड करता है जब तक कि मैं उस पृष्ठ पर न जाता हूं जिसे डेटाबेस कॉल करने की आवश्यकता होती है। मुझे relation "accounts_user" does not exist LINE 1: SELECT COUNT(*) FROM "accounts_user" जैसी त्रुटि मिलती है क्योंकि मेरा डेटाबेस माइग्रेट नहीं किया गया है।

मैंने जो कोशिश की है: मैंने चीजों की कुछ भिन्नताओं की कोशिश की है। सौभाग्य से स्टैक ओवरफ्लो पोस्ट और कुछ ट्यूटोरियल की एक बहुतायत है। दुर्भाग्यवश, वे सभी एक अलग संस्करण का उपयोग कर रहे हैं और वे जो सुझाव देते हैं वे मेरे प्रोजेक्ट पर लागू नहीं होते हैं।

यह मेरे लिए बहुत स्पष्ट है कि मुझे .ebextensions/ फ़ोल्डर के अंदर foobar.config फ़ाइल में माइग्रेशन चलाने की आवश्यकता है।

container_commands: 
    01_migrate: 
    command: "python manage.py migrate --noinput" 
    leader_only: true 

लॉग में, मैं देख रहा हूँ के बाद तैनाती स्क्रिप्ट चलाने की कोशिश की लेकिन यह विफल रहा है कि: यहाँ मैं क्या करना चाहते हैं का आधार है। मुझे त्रुटि पर कोई अन्य जानकारी नहीं मिलती है, केवल एक चीज जो मैं देखता हूं वह है "त्रुटि: 01_ माइग्रेट पोस्ट परिनियोजन स्क्रिप्ट विफल"

मुझे पता चलता है कि मुझे कमांड के लिए वर्चुअल वातावरण को सक्रिय करने की आवश्यकता है, जो बनाता है समझ। Asdf से मैं यह कोशिश करता हूं:

container_commands: 
    01_migrate: 
    command: "source /opt/python/run/venv/bin/activate && python rlg/manage.py migrate --noinput" 
    leader_only: true 

लेकिन यह काम नहीं करता है। असल में, एसएसएच के माध्यम से मुझे पता चला कि मेरे पास एक/ऑप्ट/पायथन/फ़ोल्डर भी नहीं है, केवल/ऑप्ट/aws/और/opt/elasticbeanstalk /। सभी ट्यूटोरियल और SO प्रश्न इस फ़ोल्डर को संदर्भित करते हैं लेकिन मेरे पास यह नहीं है?

VERSIONS: पायथन 3.4.1, Django 1.7.7, एडब्ल्यूएस CLI 3.2.1, Postgres 9.3

+1

मैं एक ही स्थान पर अटक गया हूं। जो मैंने पाया: कंटेनर_कॉमैंड्स डॉकर कंटेनर के भीतर निष्पादित नहीं होते हैं। उन्हें ec2 इंस्टेंस पर ही निष्पादित किया जाता है। मुझे लगता है कि हमें "डॉकर exec [container_name]/var/app/bin/python manage.py migrate --noinput दुर्भाग्यवश मैं अभी भी सही [कंटेनर_नाम] –

+0

@SebastianAnnies को खोजने में संघर्ष कर रहा हूं जैसे माइग्रेशन को निष्पादित करना होगा , खुशी है कि मैंने किसी को एक ही स्थान पर पाया! टिप के लिए धन्यवाद मैं उस पर भी काम कर रहा हूं और मुझे कुछ भी पता चलेगा जो मुझे लगता है – awwester

उत्तर

9

container_commands डोकर कंटेनर के भीतर निष्पादित नहीं हैं। उन्हें सीधे ec2 उदाहरण पर निष्पादित किया जाता है। वर्तमान में मैं माइग्रेशन करने के लिए docker exec का उपयोग कर रहा हूं। जैसा कि संबंधित डॉकर कंटेनर afaik है, आखिरी बार शुरू हुआ, मैं कंटेनर आईडी प्राप्त करने के लिए docker ps -a --no-trunc -q | head -n 1 का उपयोग करता हूं।

अंत में मेरी setup.config लग रहा है कि

container_commands: 
    01syncdb: 
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py syncdb --noinput &>> /tmp/deploy.log" 
    leader_only: true 
    02migrate: 
    command: "docker exec `docker ps -a --no-trunc -q | head -n 1` /var/app/bin/python /var/app/manage.py migrate --noinput &>> /tmp/deploy.log" 
    leader_only: true 

की तरह मुझे आशा है कि रूप में अच्छी तरह से अपनी समस्या को हल करती है।

+0

बस पढ़ना: https://forums.aws.amazon.com/ann.jspa? annID = 2 9 82 हम खुद को परेशानी बचा सकते थे ... –

+0

काम किया। धन्यवाद! – awwester

+0

मैंने कोशिश की, लेकिन मैं देख रहा हूं कि यह मेरा पुराना कंटेनर प्राप्त कर रहा है, न कि मेरा नया! क्या किसी और ने यह समस्या देखी है? मैं थोड़ा संशोधित करने की कोशिश कर रहा था, लेकिन समकक्ष कमांड: '" CONTAINER = \ 'डॉकर ps -a --no-trunc | grep aws_beanstalk | कट-डी '' -एफ 1 | हेड -1 \ 'और डॉकर निष्पादन $ CONTAINER python3 manage.py माइग्रेट करें" ' – MrColes

10

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं अपना जवाब यहां पोस्ट करना चाहता हूं क्योंकि मुझे पता लगाने में काफी समय लगा।

सेबस्टियन मानो मुझे सही दिशा में इशारा किया लेकिन इस दृष्टिकोण के साथ समस्या यह इसे चलाता तैनाती (ताकि आप पुराने कोड विस्थापित)

तुम भी ebextensions में files आदेश का उपयोग कर सकते हैं और एक फ़ाइल में लिखने से पहले है/opt/elasticbeanstalk/हुक/appdeploy/पोस्ट करने के लिए, लेकिन यह कभी उदाहरण पर चलेगा

आप में इन दो चीजों को जोड़ सकते हैं:

container_commands: 
    01migrate: 
    command: "mkdir -p /opt/elasticbeanstalk/hooks/appdeploy/post/ && echo -e '#!/bin/bash\ndocker exec `docker ps -a -q | head -n 1` python <path_to_code> migrate' > /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh && chmod +x /opt/elasticbeanstalk/hooks/appdeploy/post/99_migrate.sh" 
    leader_only: true 

यह सही di में किसी पद पर तैनाती स्क्रिप्ट पैदा करेगा आर और केवल नेता पर।

यह वास्तव में अच्छी तरह से मेरे लिए काम कर रहा है, लेकिन चेतावनी दी, हुक निर्देशिका संयुक्त राष्ट्र से प्रलेखित सुविधाओं

-1

नवीनतम लचीला बीनस्टॉक संस्करण के बारे में जानकारी अपडेट कर रहा है कर रहे हैं।

मैं 64bit Amazon Linux 2016.09 v2.3.3 running Python 3.4 का उपयोग कर रहा हूं।

निम्न आदेश virtualenv को सक्रिय किए बिना या पोस्ट ऐप को हुक पर तैनात किए बिना मेरे लिए काम करता है।

container_commands: 
    01_migrate_db: 
    command: "python manage.py db upgrade" <-- insert your migration command here 
    leader_only: true 

आदेश साबित होता है कि container commands एक पोस्ट तैनाती चरण पर अमल होगा, मैं अपने मॉडल में परिवर्तन किया, अद्यतन माइग्रेशन स्क्रिप्ट उत्पन्न, नए संस्करण को तैनात किया है और यदि डेटाबेस सफलतापूर्वक माइग्रेट किया गया था देखने के लिए जाँच की : सफलता!

+1

ऐसा इसलिए है क्योंकि आप अपने django ऐप को डॉकर कंटेनर में नहीं चला रहे हैं, बल्कि पाइथन 3.4 छवि पर। डॉकर के साथ एक सेटअप में, इसके अलग-अलग (भीतर एक कमांड चलाने के बारे में टिप्पणियां देखें नवीनतम डॉकर कंटेनर)। यह डॉकर वातावरण के लिए विशिष्ट समस्या है। – yellowcap

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