मैं अपेक्षाकृत नया डॉकर, अजवाइन और खरगोश एमक्यू के लिए नया हूं।सेलरी और खरगोश एमक्यू डॉकर कंटेनर के रूप में चल रहा है: प्रकार का अनियंत्रित कार्य '...'
हमारी परियोजना में हम वर्तमान में निम्नलिखित सेटअप:
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
यह मेरे लिए चाल किया था। उम्मीद है कि यह कुछ अन्य लोगों को समान समस्याओं के साथ मदद करता है। अब मैं कार्यों को एक अलग डॉकर कंटेनर में डालकर उस समाधान को विस्तारित करने का प्रयास करूंगा।
कारण है कि आप दोनों AMQP और redis का उपयोग कर यहाँ हैं? –
@JohnWu देर से उत्तर के लिए खेद है, लेकिन हम नहीं हैं? :) – platzhersh