2017-07-21 18 views
6

Mam aplikację Flask z operatorem Selera i Redis i działa ona zgodnie z oczekiwaniami podczas pracy na komputerze lokalnym. Następnie próbowałem Dockerize aplikacji. Kiedy próbuje budować/start usługi (czyli aplikacja kolba, selera i Redis) używając sudo docker-compose up wszystkie usługi są uruchomione z wyjątkiem selera i pokazując błąd jakoNie można uruchomić programu Celery z aplikacją dokowania

ImportError: No module named 'my_celery'

Ale ten sam kod działa na lokalnym komputerze bez jakiekolwiek błędy. Czy ktoś może zaproponować rozwiązanie?

Dockerfile

FROM python:3.5-slim 
WORKDIR celery_sample 
ADD . /celery_sample 
RUN pip install -r requirements.txt 
EXPOSE 8000 

dokowanym-compose.yml

version: "3" 
services: 

    web: 
    build: 
     context: . 
     dockerfile: Dockerfile 
    command: "python my_celery.py" 
    ports: 
     - "8000:8000" 
    networks: 
     - webnet 
    volumes: 
     - .:/celery_sample 

    redis: 
    image: redis 
    networks: 
     - webnet 


    celery: 
    image: celery:3.1.25 
    command: "celery worker -A my_celery -l INFO" 
    volumes: 
     - .:/celery_sample 
    networks: 
     - webnet 

networks: 
    webnet: 

requirements.txt

flask==0.10 
redis 
requests==2.11.1 
celery==3.1.25 

my_celery.py (uprzejmie zignorować logikę)

from flask import Flask 
from celery import Celery 
flask_app = Flask(__name__) 
celery_app = Celery('my_celery') 
celery_app.config_from_object('celeryconfig') 



@celery_app.task 
def add_celery(): 
    return str(int(10)+int(40)) 


@flask_app.route('/') 
def index(): 
    return "Index Page" 

@flask_app.route('/add') 
def add_api(): 
    add_celery.delay() 
    return "Added to Queue" 

if __name__ == '__main__': 
    flask_app.debug = True 
    flask_app.run(host='0.0.0.0', port=8000) 

celeryconfig.py

## Broker settings. 
BROKER_URL = 'redis://localhost:6379/0'  
## Using the database to store task state and results. 
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' 

Odpowiedz

4

Przede wszystkim obraz seler jest zastąpiona standardowy pyton zdjęciu Więcej informacji here.

WORKDIR ustawia katalog roboczy dla wszystkich poleceń po zdefiniowaniu go w pliku Dockerfile, co oznacza, że ​​polecenie, które próbujesz uruchomić, będzie uruchamiane z tego katalogu. Obraz dokera dla selera ustawia katalog roboczy na /home/user.

Ponieważ twój kod jest zamontowany na /celery_smaple, a katalog roboczy to /home/user, Seler nie może znaleźć Twojego modułu python.

Jedną z alternatyw jest CD do zamontowanego katalogu i wykonać polecenie:

celery: 
    image: celery:3.1.25 
    command: "cd /celery_sample && celery worker -A my_celery -l INFO" 
    volumes: 
     - .:/celery_sample 
    networks: 
     - webnet 

zawiadomienie polecenie

a drugi jest stworzenie własnego obrazu z WORKDIR zestaw do /celery_sample np

FROM python:3.5 
RUN pip install celery==3.1.25 
WORKDIR /celery_sample 

po utworzeniu własnego obrazu możesz użyć pliku do komponowania, zmieniając image Usługa seler

Edit

Trzeba połączyć usługi do siebie w celu komunikowania się:

version: "3" 
services: 
    web: 
    build: 
     context: . 
     dockerfile: Dockerfile 
    command: "python my_celery.py" 
    ports: 
     - "8000:8000" 
    networks: 
     - webnet 
    volumes: 
     - .:/celery_sample 
    links: 
     - redis 

    redis: 
    image: redis 
    networks: 
     - webnet 

    celery: 
    image: celery:3.1.25 
    command: "celery worker -A my_celery -l INFO" 
    volumes: 
     - .:/home/user 
    networks: 
     - webnet 
    links: 
     - redis 

networks: 
    webnet: 

i plik konfiguracyjny powinien być:

## Broker settings. 
BROKER_URL = 'redis://redis:6379/0'  
## Using the database to store task state and results. 
CELERY_RESULT_BACKEND = 'redis://redis:6379/0' 

Po połączyły usługi w pliku komponowania, do którego można uzyskać dostęp, korzystając z nazwy usługi jako nazwy hosta.

+0

Po przeczytaniu odpowiedzi wprowadziłem pewne zmiany do mojego projektu. ** 1: ** Zamontował zawartość projektu do usług selera "** WORKDIR ** jako" tom: -.:/Home/user' i pozostaje 'command' niezmieniony ** 2: ** buduję ** usługi selera ** z innym plikiem Docker i wewnątrz tego pliku Dockerfile zainstalowałem ten sam ** requirements.txt **. (stało się tak, ponieważ nie mogłem uruchomić selera bez zależności). ** 3: ** EXPOSEd port 6379 w obu plikach Docker. –

+0

Problem polega na tym, że seler nie mógł znaleźć serwera redis. Błąd to 'celery_1 | [2017-07-22 03: 44: 52,778: ERROR/MainProcess] consumer: Nie można połączyć się z redis: // localhost: 6379/0:. selera_1 | Próbuję ponownie za 12,00 sekund ... '@vedarthk @ Tarun Lalwani –

+0

To zadziałało. Thanx –

2

Najprostszym zmiany można dokonać jest mapowanie katalogu dla selera obrazek poprawnie w YAML

celery: 
    image: celery:3.1.25 
    command: "celery worker -A my_celery -l INFO" 
    volumes: 
     - .:/home/user/ 
    networks: 
     - webnet 

również jako @vedarthk wskazał, należy używać oficjalnego Pythona zdjęcie to zamiast selera obrazu

Powiązane problemy