2016-11-28 36 views
0

我正在docker-compose拒絕彙集的Django,芹菜,Postgres的和RabbitMQ的,具有以下泊塢窗,compose.yml多克爾 - 撰寫連接芹菜

version: '2' 

services: 
    # PostgreSQL database 
    db: 
    image: postgres:9.4 
    hostname: db 
    environment: 
     - POSTGRES_USER=<XXX> 
     - POSTGRES_PASSWORD=<XXX> 
     - POSTGRES_DB=<XXX> 
    ports: 
     - "5431:5432" 

    rabbit: 
    hostname: rabbit 
    image: rabbitmq:3-management 
    environment: 
     - RABBITMQ_DEFAULT_USER=<XXX> 
     - RABBITMQ_DEFAULT_PASS=<XXX> 
    ports: 
     - "5672:5672" 
     - "15672:15672" 

    # Django web server 
    web: 
    build: 
     context: . 
     dockerfile: Dockerfile 
    hostname: web 
    command: /srv/www/run_web.sh 
    volumes: 
      - .:/srv/www 
    ports: 
     - "8000:8000" 
    links: 
     - db 
     - rabbit 
    depends_on: 
     - db 

    # Celery worker 
    worker: 
     hostname: celery 
     build: 
      context: . 
      dockerfile: Dockerfile 
     command: /srv/www/run_celery.sh 
     volumes: 
      - .:/srv/www 
     links: 
      - db 
      - rabbit 
     depends_on: 
      - rabbit 

在Django的意見我委派出一個其中做了一些處理,然後芹菜任務試圖後的結果到另一個Web服務:

#views.py 
@csrf_exempt 
def process_data(request): 
    if request.method == 'POST': 

     # 
     #Processing to retrieve data here 
     # 

     delegate_celery_task.delay(data) 
    return HttpResponse(status=200) 

#tasks.py 
@app.task 
def delegate_celery_task(in_data): 
    from extractorService.settings import MASTER_NODE 
    import json 
    import urllib 

    # 
    #Some processing on in_data here to give out_data 
    # 

    data = {'data': out_data} 
    params = json.dumps(data).encode('utf8') 

    req = urllib.request.Request('http://%s/api/data/'%(MASTER_NODE), data=params, 
       headers={'content-type': 'application/json'}) 

    urllib.request.urlopen(req) 

現在MASTER_NODE僅僅是本地主機:8001我在哪裏運行的其他網絡服務。當我運行碼頭以外的所有東西時,安裝程​​序會運行。在啓動碼頭工人雖然工作進程給出:

worker_1 | [2016-11-28 12:20:17,527: WARNING/PoolWorker-2] unable to cache TLDs in file /usr/local/lib/python3.5/site-packages/tldextract/.tld_set: [Errno 13] Permission denied: '/ usr/local/lib/python3.5/site-packages/tldextract/.tld_set'

,然後張貼到Django的觀點,芹菜工人開始,但對的urlopen調用提供了一個錯誤:

worker_1 | Traceback (most recent call last): worker_1 | File "/usr/local/lib/python3.5/site-packages/celery/app/trace.py", line 368, in trace_task worker_1 | R = retval = fun(*args, **kwargs) worker_1 | File "/usr/local/lib/python3.5/site-packages/celery/app/trace.py", line 623, in protected_call worker_1 | return self.run(*args, **kwargs) worker_1 | File "/srv/extractor_django/extractorService/tasks.py", line 25, in extract_entities worker_1 | urllib.request.urlopen(req) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 162, in urlopen worker_1 | return opener.open(url, data, timeout) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 465, in open worker_1 | response = self._open(req, data) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 483, in _open worker_1 | '_open', req) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 443, in _call_chain worker_1 | result = func(*args) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 1268, in http_open worker_1 | return self.do_open(http.client.HTTPConnection, req) worker_1 | File "/usr/local/lib/python3.5/urllib/request.py", line 1242, in do_open worker_1 | raise URLError(err) worker_1 | urllib.error.URLError:

的在settings.py中的芹菜配置是:

RABBIT_HOSTNAME = os.environ.get('RABBIT_PORT_5672_TCP', 'rabbit') 
if RABBIT_HOSTNAME.startswith('tcp://'): 
    RABBIT_HOSTNAME = RABBIT_HOSTNAME.split('//')[1] 

BROKER_URL = os.environ.get('BROKER_URL', '') 
if not BROKER_URL: 
    BROKER_URL = 'amqp://{user}:{password}@{hostname}'.format(
     user=os.environ.get('RABBIT_ENV_USER', '<XXX>'), 
     password=os.environ.get('RABBIT_ENV_RABBITMQ_PASS', '<XXX>'), 
     hostname=RABBIT_HOSTNAME) 

BROKER_HEARTBEAT = '?heartbeat=30' 
if not BROKER_URL.endswith(BROKER_HEARTBEAT): 
BROKER_URL += BROKER_HEARTBEAT 

BROKER_POOL_LIMIT = 1 
BROKER_CONNECTION_TIMEOUT = 10 

CELERY_DEFAULT_QUEUE = 'default' 
CELERY_QUEUES = (
Queue('default', Exchange('default'), routing_key='default'),) 

CELERY_ALWAYS_EAGER = False 
CELERY_ACKS_LATE = True 
CELERY_TASK_PUBLISH_RETRY = True 
CELERY_DISABLE_RATE_LIMITS = False 

CELERY_IGNORE_RESULT = True 
CELERY_SEND_TASK_ERROR_EMAILS = False 
CELERY_TASK_RESULT_EXPIRES = 600 

CELERYD_HIJACK_ROOT_LOGGER = False 
CELERYD_PREFETCH_MULTIPLIER = 1 
CELERYD_MAX_TASKS_PER_CHILD = 1000 

有沒有人有任何想法如何可以修復ED?

+0

哪裏是你的芹菜嘗試後從V3.1更新芹菜v4和?它應該對你的兔子容器而不是本地主機發出請求。 – user3012759

+0

它正試圖發佈到在碼頭外運行的外部站點。在開發中,這是我的機器的本地主機在運行另一個Web服務的端口8001上,但是在AWS上運行的站點上。 – mohevi

+0

我更關心什麼是你正在創建的芹菜任務的後端配置? – user3012759

回答

0

你沒有提到芹菜的版本,但從發佈日期我可以猜測它是v4。

我只是有類似的問題,因爲根據該tutorial這是需要改變BROKER_URLCELERY_BROKER_URLsettings.py