2017-07-21 20 views
6

Tôi có ứng dụng Flask với công nhân Celery và Redis và nó hoạt động bình thường như mong đợi khi chạy trên máy cục bộ. Sau đó, tôi đã cố gắng để Dockerize ứng dụng. Khi tôi cố gắng xây dựng/khởi động dịch vụ (ví dụ, ứng dụng bình, cần tây, và Redis) sử dụng sudo docker-compose up tất cả các dịch vụ đang chạy trừ cần tây và hiển thị một lỗi nhưkhông thể khởi động Celery với docker-compose

ImportError: No module named 'my_celery'

Nhưng, cùng mã làm việc tại máy cục bộ mà không bất kỳ lỗi nào. Bất kỳ ai có thể đề xuất giải pháp?

Dockerfile

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

Docker-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 (vui lòng bỏ qua logic)

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' 

Trả lời

4

Đầu tiên của tất cả các hình ảnh cần tây được phản đối ủng hộ hình ảnh python tiêu chuẩn biết thêm here.

WORKDIR đặt thư mục làm việc cho tất cả lệnh sau khi được xác định trong Dockerfile, có nghĩa là lệnh mà bạn đang cố gắng chạy sẽ chạy từ thư mục đó. Hình ảnh Docker cho cần tây đặt thư mục làm việc thành /home/user.

Vì mã của bạn được gắn trên /celery_smaple và thư mục hoạt động là /home/user, Cần tây không thể tìm thấy mô-đun python của bạn.

Một thay thế là cd vào thư mục gắn kết và thực hiện lệnh:

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

thông báo lệnh

Và một số khác là tạo ra hình ảnh của riêng bạn với WORKDIR thiết lập để /celery_sample ví dụ:

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

sau khi tạo hình ảnh của riêng bạn, bạn có thể sử dụng tệp soạn thư bằng cách thay đổi image của dịch vụ cần tây

Sửa

Bạn cần liên kết các dịch vụ với nhau để giao tiếp:

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: 

và tập tin cấu hình của bạn nên là:

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

khi bạn đã liên kết các dịch vụ trong tệp soạn thư, bạn có thể truy cập dịch vụ bằng cách sử dụng tên dịch vụ làm tên máy chủ.

+0

Tôi đã thực hiện một số thay đổi đối với dự án của mình sau khi đọc câu trả lời của bạn. ** 1: ** Đã gắn nội dung của dự án vào các dịch vụ cần tây '** WORKDIR ** dưới dạng 'tập: -.:/Home/user' và vẫn là lệnh' không thay đổi ** **: ** I build ** ** với Dockerfile khác và bên trong Dockerfile tôi đã cài đặt cùng ** requirements.txt **. (điều này được thực hiện bởi vì tôi không thể chạy công nhân cần tây mà không có sự phụ thuộc). ** 3: ** TỪ KHÓA cổng 6379 trong cả hai Dockerfiles. –

+0

Bây giờ vấn đề là cần tây không thể tìm thấy máy chủ redis. Lỗi là 'celery_1 | [2017-07-22 03: 44: 52,778: ERROR/MainProcess] người tiêu dùng: Không thể kết nối với redis: // localhost: 6379/0:. celery_1 | Thử lại sau 12 giây ... '@vedarthk @Tarun Lalwani –

+0

Đã hoạt động. Thanx –

2

Sự thay đổi đơn giản nhất bạn có thể làm là để ánh xạ thư mục cho hình ảnh cần tây một cách chính xác trong yaml

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

Cũng như @vedarthk chỉ, bạn nên sử dụng các hình ảnh Python chính thức cho việc này thay vì hình ảnh cần tây

Các vấn đề liên quan