0

I have a django channels container and a celery worker and I'm trying to connect to my django channels container inside the celery container, however, I'm finding it difficulty to connect. I have a django server running on http://127.0.0.1:8000/. This is how my docker-compose file looks like

web:
  restart: always
  tty: true
  build: ./web/
  working_dir: /data/web/fileshiffty
  expose:
    - "8000"
  ports:
    - "8000:8000"
  links:
    - postgres:postgres
    - redis:redis
  env_file: env
  volumes:
    - ./web:/data/web
  command: bash -c "python3 manage.py runserver 0.0.0.0:8000"
postgres:
  restart: always
  image: postgres:latest
  volumes_from:
    - data
  volumes:
    - ./postgres/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
    - ./backups/postgresql:/backup
  env_file:
    - env
  expose:
    - "5432"
redis:
  restart: always
  image: redis:latest
  expose:
    - "6379"
worker:
    build: ./web/
    working_dir: /data/web/fileshiffty
    command: bash -c "celery -A fileshiffty worker --loglevel=DEBUG"
    volumes:
      - ./web:/data/web
    links:
      - postgres:postgres
      - redis:redis
      - web:web
data:
  restart: always
  image: alpine
  volumes:
    - /var/lib/postgresql
  command: "true"

However, inside on my celery tasks it requires it to connect to a web socket with url ws://127.0.0.1:8000/ws/converter/public/. This is how my tasks looks like

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task
import img2pdf
import os
import websocket 
import json
import boto
from boto.s3.key import Key

@shared_task
def convert_file_to_pdf(file_name_on_cdn):
    ws = websocket.WebSocket()
    ws.connect('ws://web/ws/converter/public/')
    ws.send(json.dumps({
        'message': '{}'.format(file_name_on_cdn), 
        'progress': 0}))
    # some other stuff 

However, I keep getting the following error when the task is run

worker_1    | [2018-03-21 16:19:03,392: ERROR/ForkPoolWorker-2] Task api.tasks.convert_file_to_pdf[2fb26db9-7dd5-4b57-9242-fd61e743952d] raised unexpected: ConnectionRefusedError(111, 'Connection refused')
worker_1    | Traceback (most recent call last):
worker_1    |   File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 374, in trace_task
worker_1    |     R = retval = fun(*args, **kwargs)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/celery/app/trace.py", line 629, in __protected_call__
worker_1    |     return self.run(*args, **kwargs)
worker_1    |   File "/data/web/fileshiffty/api/tasks.py", line 30, in convert_file_to_pdf
worker_1    |     ws.connect('ws://web/ws/converter/public/')
worker_1    |   File "/usr/local/lib/python3.6/site-packages/websocket/_core.py", line 217, in connect
worker_1    |     options.pop('socket', None))
worker_1    |   File "/usr/local/lib/python3.6/site-packages/websocket/_http.py", line 70, in connect
worker_1    |     sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
worker_1    |   File "/usr/local/lib/python3.6/site-packages/websocket/_http.py", line 131, in _open_socket
worker_1    |     raise err
worker_1    |   File "/usr/local/lib/python3.6/site-packages/websocket/_http.py", line 116, in _open_socket
worker_1    |     sock.connect(address)
worker_1    | ConnectionRefusedError: [Errno 111] Connection refused

It's clear that it cannot connect to the url. I even tried setting ws.connect('ws://web/ws/converter/public/'), however, that doesn't seem to be working either. Any help would be appreciated. Been trying to figure out what's wrong for many hours

alpha787
  • 171
  • 4
  • 10

1 Answers1

0

Looks like all I had to do was specify the port that my Django application was running which was port 8000 so I just needed to change ws to ws.connect('ws://web:8000/ws/converter/public/')

alpha787
  • 171
  • 4
  • 10