2015-04-08 8 views
17

मैं अपेक्षाकृत नया डॉकर, अजवाइन और खरगोश एमक्यू के लिए नया हूं।सेलरी और खरगोश एमक्यू डॉकर कंटेनर के रूप में चल रहा है: प्रकार का अनियंत्रित कार्य '...'

हमारी परियोजना में हम वर्तमान में निम्नलिखित सेटअप:

1x RabbitMQ: 3-प्रबंधन कंटेनर

# pull image from docker hub and install 
docker pull rabbitmq:3-management 
# run docker image 
docker run -d -e RABBITMQ_NODENAME=my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 rabbitmq:3-management 

1x अजवाइन कंटेनर

1 कई डोकर चल कंटेनर के साथ शारीरिक मेजबान
# pull docker image from docker hub 
docker pull celery 
# run celery container 
docker run --link some-rabbit:rabbit --name some-celery -d celery 

(वें पहले कुछ और कंटेनर हैं, लेकिन वे) समस्या के साथ कुछ भी

टास्क फ़ाइल

अजवाइन को जानते हैं और एक सा RabbitMQ को प्राप्त करने के लिए ऐसा करने के लिए नहीं करना चाहिए था, मैं शारीरिक पर एक tasks.py फ़ाइल बनाई मेजबान:

from celery import Celery 

app = Celery('tasks', backend='amqp', broker='amqp://guest:[email protected]/') 

@app.task(name='tasks.add') 
def add(x, y): 
    return x + y 

पूरे सेटअप वास्तव में काफी ठीक काम कर रहा है। तो जब मैं निर्देशिका है जहाँ tasks.py स्थित है में एक अजगर खोल खोलने के लिए और चलाने के

>>> from tasks import add 
>>> add.delay(4,4) 

कार्य पंक्तिबद्ध हो जाता है और सीधे अजवाइन कार्यकर्ता से खींच लिया।

हालांकि, अजवाइन कार्यकर्ता लॉग के लिए के बारे में कार्य मॉड्यूल को पता है कि नहीं:

$ docker logs some-celery 


[2015-04-08 11:25:24,669: ERROR/MainProcess] Received unregistered task of type 'tasks.add'. 
The message has been ignored and discarded. 

Did you remember to import the module containing this task? 
Or maybe you are using relative imports? 
Please see http://bit.ly/gLye1c for more information. 

The full contents of the message body was: 
{'callbacks': None, 'timelimit': (None, None), 'retries': 0, 'id': '2b5dc209-3c41-4a8d-8efe-ed450d537e56', 'args': (4, 4), 'eta': None, 'utc': True, 'taskset': None, 'task': 'tasks.add', 'errbacks': None, 'kwargs': {}, 'chord': None, 'expires': None} (256b) 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/site-packages/celery/worker/consumer.py", line 455, in on_task_received 
strategies[name](message, body, 
KeyError: 'tasks.add' 

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

किसी भी मदद की सराहना की है :)


संपादित 2015/04/08, 21:05: जवाब के लिए Isowen को

धन्यवाद। बस पूर्णता के लिए मैंने यह किया है:

मान लें कि मेरा tasks.py/home/platzhersh/celerystuff में मेरी स्थानीय मशीन पर स्थित है। अब मैं निम्नलिखित सामग्री के साथ एक ही निर्देशिका में celeryconfig.py बनाया:

CELERY_IMPORTS = ('tasks') 
CELERY_IGNORE_RESULT = False 
CELERY_RESULT_BACKEND = 'amqp' 

Isowen से उल्लेख किया है, कार्यों और config फ़ाइलों के लिए कंटेनर के अजवाइन खोजें /home/user। इसलिए हम कंटेनर में /home/platzhersh/celerystuff माउंट जब शुरू करने:

run -v /home/platzhersh/celerystuff:/home/user --link some-rabbit:rabbit --name some-celery -d celery 

यह मेरे लिए चाल किया था। उम्मीद है कि यह कुछ अन्य लोगों को समान समस्याओं के साथ मदद करता है। अब मैं कार्यों को एक अलग डॉकर कंटेनर में डालकर उस समाधान को विस्तारित करने का प्रयास करूंगा।

+0

कारण है कि आप दोनों AMQP और redis का उपयोग कर यहाँ हैं? –

+0

@JohnWu देर से उत्तर के लिए खेद है, लेकिन हम नहीं हैं? :) – platzhersh

उत्तर

11

आपको संदेह के रूप में, इस मुद्दे क्योंकि अजवाइन कार्यकर्ता कार्य मॉड्यूल पता नहीं है। आपको दो चीजें करने की ज़रूरत है:

  1. अपनी कार्य परिभाषाओं को डॉकर कंटेनर में "इन" करें।
  2. उन कार्य परिभाषाओं को लोड करने के लिए अजवाइन कार्यकर्ता को कॉन्फ़िगर करें।

आइटम के लिए (1), सबसे आसान तरीका है एक "Docker Volume" उपयोग करने के लिए अजवाइन डोकर उदाहरण पर अपने कोड के एक मेजबान निर्देशिका माउंट करने के लिए शायद है। की तरह कुछ:

docker run --link some-rabbit:rabbit -v /path/to/host/code:/home/user --name some-celery -d celery 

कहाँ /path/to/host/code आपके मेजबान पथ है, और /home/user पथ उदाहरण पर माउंट करने के लिए है। इस मामले में /home/user क्यों? क्योंकि सेलेरी छवि के लिए Dockerfile कार्यशील निर्देशिका (WORKDIR) को /home/user के रूप में परिभाषित करता है।

(नोट: (1) कोड "में बनाया" के साथ एक कस्टम डोकर छवि का निर्माण किया जाएगा मद पूरा करने के लिए एक और तरीका है, लेकिन मुझे लगता है कि छोड़ देंगे पाठक के लिए एक व्यायाम के रूप।)

मद के लिए (2), आपको एक सेलेरी कॉन्फ़िगरेशन फ़ाइल बनाने की आवश्यकता है जो कार्य फ़ाइल आयात करता है। यह एक अधिक सामान्य मुद्दा है, इसलिए मैं पिछले एक stackoverflow जवाब को इंगित करेंगे: Celery Received unregistered task of type (run example)

+0

अरे Isowen, इस तेजी से जवाब के लिए धन्यवाद! मैंने पहले ही task.py फ़ाइल को आरोहित करने का प्रयास किया है, लेकिन मुझे नहीं पता था कि मुझे इसे/home/user में आरोहित करना था। मैं celeryconfig कहां रखूँगा? इसके अलावा/घर/उपयोगकर्ता? दरअसल हम अंत में कई अलग-अलग मेजबानों से कार्यों का उपभोग करना चाहते हैं, इसलिए हमें सभी कार्य फ़ाइलों को आरोहित करने के अलावा एक अच्छा समाधान खोजना होगा। लेकिन यह इस पल के लिए ठीक है, यह देखने के लिए कि कोई बुनियादी सेटअप काम करेगा या नहीं। – platzhersh

+1

@platzhersh आप वास्तव में एक अलग निर्देशिका में माउंट कर सकते हैं, लेकिन फिर यह चलने पर अजवाइन का 'पीडब्ल्यूडी' नहीं होगा, इसलिए पाइथन खोज पथ में कोड जोड़ना एक अतिरिक्त कदम उठाएगा। दूसरे शब्दों में, '/ home/user' का उपयोग करना सबसे आसान है। उम्मीद है की वो मदद करदे! – lsowen

+1

@platzhersh लंबे समय तक आपको एक डॉकर छवि बनाना चाहिए जिसमें आपके कार्य हैं। –

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