2015-04-08 16 views
17

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.

+0

perché stai entrambi utilizzando amqp e redis qui? –

+0

@JohnWu dispiace per la risposta in ritardo, ma non lo siamo? :) – platzhersh

risposta

11

Come sospetti, il problema è dovuto al fatto che il gestore di sedici non conosce il modulo delle attività. Ci sono due cose che devi fare:

  1. Ottieni le definizioni delle attività "nel" contenitore docker.
  2. Configurare il gestore di sedici per caricare le definizioni di attività.

Per Articolo (1), il modo più semplice è probabilmente quello di utilizzare un "Docker Volume" per montare una directory host del codice sull'istanza della finestra mobile di sedano. Qualcosa di simile:

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

Dove /path/to/host/code è il vostro percorso host e /home/user è il percorso per montarlo su l'istanza. Perché /home/user in questo caso? Poiché lo Dockerfile per l'immagine di sedano definisce la directory di lavoro (WORKDIR) come /home/user.

(Nota: Un altro modo per realizzare Prodotto (1) sarebbe quello di costruire un'immagine di finestra mobile personalizzato con il codice "costruito in", ma lascerò che come esercizio per il lettore.)

Per la voce (2), è necessario creare un file di configurazione del sedano che importi il ​​file delle attività. Questo è un problema più generale, quindi farò riferimento a una precedente risposta StackOverflow: Celery Received unregistered task of type (run example)

+0

Hey Isowen, grazie per questa risposta veloce! Ho già provato a montare il file tasks.py, ma non sapevo di doverlo montare in/home/user. Dove metterei il celeryconfig? Anche/home/utente? In realtà, al termine, desideriamo consumare attività da più host diversi, quindi dovremmo trovare una buona soluzione oltre a montare tutti i file di attività. Ma per il momento va bene, per vedere se una configurazione di base funzionerebbe. – platzhersh

+1

@platzhersh si potrebbe effettivamente montare su una directory diversa, ma non sarebbe il 'PWD' di sedano quando viene eseguito, quindi aggiungere il codice al percorso di ricerca di Python richiederebbe un ulteriore passaggio. In altre parole, è più facile usare '/ home/user'. Spero possa aiutare! – lsowen

+1

@platzhersh a lungo termine si dovrebbe costruire un'immagine docker che ha le attività in esso. –

Problemi correlati