Sono relativamente nuovo alla finestra mobile, al sedano e al coniglioMQ.Celery & RabbitMQ in esecuzione come contenitori docker: attività non registrata ricevuta di tipo '...'
Nel nostro progetto abbiamo attualmente la seguente configurazione: 1 host fisico con più contenitori docker in esecuzione:
1x RabbitMQ: contenitore 3-gestione
# 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 contenitore sedano
# pull docker image from docker hub
docker pull celery
# run celery container
docker run --link some-rabbit:rabbit --name some-celery -d celery
(th ere sono alcuni più contenitori, ma non dovrebbero avere a che fare nulla con il problema)
attività File
per conoscere il sedano e RabbitMQ un po ', ho creato un file tasks.py sul piano fisico host:
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
L'intera installazione sembra funzionare abbastanza bene in realtà. Così, quando apro una shell Python nella directory in cui si trova tasks.py e corro
>>> from tasks import add
>>> add.delay(4,4)
Il compito viene messo in coda e direttamente tirato da parte del lavoratore di sedano.
Tuttavia, il lavoratore sedano non conosce il modulo di compiti per quanto riguarda i registri di:
$ 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'
Così il problema sembra, ovviamente, di essere, che i lavoratori di sedano nel contenitore sedano non conoscono il modulo compiti. Ora che non sono uno specialista di docker, volevo chiedere come avrei importato il modulo delle attività nel contenitore di sedano?
Ogni aiuto è apprezzato :)
EDIT 2015/04/08, 21:05:
Grazie a Isowen per la risposta. Solo per completezza ecco cosa ho fatto:
Supponiamo che il mio tasks.py
si trovi sul mio computer locale in /home/platzhersh/celerystuff
. Ora ho creato un celeryconfig.py
nella stessa directory con il seguente contenuto:
CELERY_IMPORTS = ('tasks')
CELERY_IGNORE_RESULT = False
CELERY_RESULT_BACKEND = 'amqp'
Come menzionato da Isowen, ricerche sedano /home/user
del contenitore per i compiti e file di configurazione. Così si monta la /home/platzhersh/celerystuff
nel contenitore quando si inizia:
run -v /home/platzhersh/celerystuff:/home/user --link some-rabbit:rabbit --name some-celery -d celery
Questo ha fatto il trucco per me. Spero che questo aiuti alcune altre persone con problemi simili. Ora cercherò di espandere questa soluzione inserendo le attività anche in un contenitore di finestra mobile separato.
perché stai entrambi utilizzando amqp e redis qui? –
@JohnWu dispiace per la risposta in ritardo, ma non lo siamo? :) – platzhersh