Flask не может подключиться к Redis и Celery с помощью Docker-ComposePython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Flask не может подключиться к Redis и Celery с помощью Docker-Compose

Сообщение Anonymous »

Я могу без проблем запускать общие задачи сельдерея в оболочке контейнера flask (называемого веб-интерфейсом) (docker-compose exec web flask shell), однако время ожидания истекает при прохождении маршрута. Подозревая, что контейнер Redis недоступен, я выполнил следующее как в оболочке контейнера, так и внутри маршрута. Я нашел IP-адрес контейнера Redis с помощью проверки сети Docker .
import redis
print(f'{redis.Redis(host="172.22.0.2", port=6379).ping()=}')
print(f'{redis.Redis(host='redis', port=6379).ping()=}')

Ссылка на IP работает правильно как в оболочке фляги, так и в маршруте. Однако ссылка на имя контейнера не работает только на маршруте. Я не понимаю, как имя может правильно разрешаться в оболочке колбы, но не маршрут.
Полный журнал ошибок при попытке вызвать приведенные выше операторы печати в маршруте:web_1 | redis.Redis(host="172.23.0.2", port=6379).ping()=True
web_1 | [2024-07-24 14:14:08 +0000] [9] [ERROR] Error handling request /main/test_task
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 464, in resolve
web_1 | return _proxy.query(name, rdtype, raise_on_no_answer=raises,
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 420, in query
web_1 | return end()
web_1 | ^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 399, in end
web_1 | raise result[1]
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 380, in step
web_1 | a = fun(*args, **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1364, in query
web_1 | return self.resolve(
web_1 | ^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1321, in resolve
web_1 | timeout = self._compute_timeout(start, lifetime, resolution.errors)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1075, in _compute_timeout
web_1 | raise LifetimeTimeout(timeout=duration, errors=errors)
web_1 | dns.resolver.LifetimeTimeout: The resolution lifetime expired after 5.106 seconds: Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 264, in connect
web_1 | sock = self.retry.call_with_retry(
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/retry.py", line 46, in call_with_retry
web_1 | return do()
web_1 | ^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 265, in
web_1 | lambda: self._connect(), lambda error: self.disconnect(error)
web_1 | ^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 595, in _connect
web_1 | for res in socket.getaddrinfo(
web_1 | ^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 559, in getaddrinfo
web_1 | qname, addrs = _getaddrinfo_lookup(host, family, flags)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 530, in _getaddrinfo_lookup
web_1 | raise err
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 519, in _getaddrinfo_lookup
web_1 | answer = resolve(host, qfamily, False, use_network=use_network)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 472, in resolve
web_1 | _raise_new_error(EAI_EAGAIN_ERROR)
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 101, in _raise_new_error
web_1 | raise error_instance.__class__(*error_instance.args)
web_1 | socket.gaierror: [Errno -3] Lookup timed out
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/base_async.py", line 55, in handle
web_1 | self.handle_request(listener_name, req, client, addr)
web_1 | File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/base_async.py", line 108, in handle_request
web_1 | respiter = self.wsgi(environ, resp.start_response)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1478, in __call__
web_1 | return self.wsgi_app(environ, start_response)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1458, in wsgi_app
web_1 | response = self.handle_exception(e)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1455, in wsgi_app
web_1 | response = self.full_dispatch_request()
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 869, in full_dispatch_request
web_1 | rv = self.handle_user_exception(e)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 867, in full_dispatch_request
web_1 | rv = self.dispatch_request()
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 852, in dispatch_request
web_1 | return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask_login/utils.py", line 290, in decorated_view
web_1 | return current_app.ensure_sync(func)(*args, **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/app/web/main/views.py", line 75, in test_task
nginx_1 | 172.23.0.1 - - [24/Jul/2024:14:14:08 +0000] "GET /main/test_task HTTP/1.1" 500 141 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
web_1 | print(f'{redis.Redis(host="redis", port=6379).ping()=}')
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/commands/core.py", line 1216, in ping
web_1 | return self.execute_command("PING", **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/client.py", line 533, in execute_command
web_1 | conn = self.connection or pool.get_connection(command_name, **options)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 1086, in get_connection
web_1 | connection.connect()
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 270, in connect
web_1 | raise ConnectionError(self._error_message(e))
web_1 | redis.exceptions.ConnectionError: Error -3 connecting to redis:6379. Lookup timed out.

Полный журнал ошибок при попытке вызвать Task_test.delay() в маршруте:
web_1 | [2024-07-24 12:54:11 +0000] [12] [ERROR] Error handling request /main/test_task
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 464, in resolve
web_1 | return _proxy.query(name, rdtype, raise_on_no_answer=raises,
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 420, in query
web_1 | return end()
web_1 | ^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 399, in end
web_1 | raise result[1]
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 380, in step
web_1 | a = fun(*args, **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1364, in query
web_1 | return self.resolve(
web_1 | ^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1321, in resolve
web_1 | timeout = self._compute_timeout(start, lifetime, resolution.errors)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/dns/resolver.py", line 1075, in _compute_timeout
web_1 | raise LifetimeTimeout(timeout=duration, errors=errors)
web_1 | dns.resolver.LifetimeTimeout: The resolution lifetime expired after 5.106 seconds: Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'; Server Do53:127.0.0.11@53 answered udp() got an unexpected keyword argument 'ignore_errors'
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 264, in connect
web_1 | sock = self.retry.call_with_retry(
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/retry.py", line 46, in call_with_retry
web_1 | return do()
web_1 | ^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 265, in
web_1 | lambda: self._connect(), lambda error: self.disconnect(error)
web_1 | ^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 595, in _connect
web_1 | for res in socket.getaddrinfo(
web_1 | ^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 559, in getaddrinfo
web_1 | qname, addrs = _getaddrinfo_lookup(host, family, flags)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 530, in _getaddrinfo_lookup
web_1 | raise err
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 519, in _getaddrinfo_lookup
web_1 | answer = resolve(host, qfamily, False, use_network=use_network)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 472, in resolve
web_1 | _raise_new_error(EAI_EAGAIN_ERROR)
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 101, in _raise_new_error
web_1 | raise error_instance.__class__(*error_instance.args)
web_1 | socket.gaierror: [Errno -3] Lookup timed out
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 127, in reconnect_on_error
web_1 | yield
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 177, in _consume_from
web_1 | self._pubsub.subscribe(key)
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/client.py", line 916, in subscribe
web_1 | ret_val = self.execute_command("SUBSCRIBE", *new_channels.keys())
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/client.py", line 749, in execute_command
web_1 | self.connection = self.connection_pool.get_connection(
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 1086, in get_connection
web_1 | connection.connect()
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 270, in connect
web_1 | raise ConnectionError(self._error_message(e))
web_1 | redis.exceptions.ConnectionError: Error -3 connecting to redis:6379. Lookup timed out.
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 264, in connect
web_1 | sock = self.retry.call_with_retry(
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/retry.py", line 46, in call_with_retry
web_1 | return do()
web_1 | ^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 265, in
web_1 | lambda: self._connect(), lambda error: self.disconnect(error)
web_1 | ^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 595, in _connect
web_1 | for res in socket.getaddrinfo(
web_1 | ^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 559, in getaddrinfo
web_1 | qname, addrs = _getaddrinfo_lookup(host, family, flags)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 530, in _getaddrinfo_lookup
web_1 | raise err
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 519, in _getaddrinfo_lookup
web_1 | answer = resolve(host, qfamily, False, use_network=use_network)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 472, in resolve
web_1 | _raise_new_error(EAI_EAGAIN_ERROR)
web_1 | File "/usr/local/lib/python3.12/site-packages/eventlet/support/greendns.py", line 101, in _raise_new_error
web_1 | raise error_instance.__class__(*error_instance.args)
web_1 | socket.gaierror: [Errno -3] Lookup timed out
web_1 |
web_1 | During handling of the above exception, another exception occurred:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/kombu/connection.py", line 472, in _reraise_as_library_errors
web_1 | yield
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/app/base.py", line 798, in send_task
web_1 | self.backend.on_task_call(P, task_id)
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 373, in on_task_call
web_1 | self.result_consumer.consume_from(task_id)
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 169, in consume_from
web_1 | return self.start(task_id)
web_1 | ^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 147, in start
web_1 | self._consume_from(initial_task_id)
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 176, in _consume_from
web_1 | with self.reconnect_on_error():
web_1 | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__
web_1 | self.gen.throw(value)
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 130, in reconnect_on_error
web_1 | self._ensure(self._reconnect_pubsub, ())
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 384, in ensure
web_1 | return retry_over_time(
web_1 | ^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/kombu/utils/functional.py", line 318, in retry_over_time
web_1 | return fun(*args, **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/backends/redis.py", line 106, in _reconnect_pubsub
web_1 | metas = self.backend.client.mget(self.subscribed_to)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/commands/core.py", line 2015, in mget
web_1 | return self.execute_command("MGET", *args, **options)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/client.py", line 533, in execute_command
web_1 | conn = self.connection or pool.get_connection(command_name, **options)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 1086, in get_connection
web_1 | connection.connect()
web_1 | File "/usr/local/lib/python3.12/site-packages/redis/connection.py", line 270, in connect
web_1 | raise ConnectionError(self._error_message(e))
web_1 | redis.exceptions.ConnectionError: Error -3 connecting to redis:6379. Lookup timed out.
web_1 |
web_1 | The above exception was the direct cause of the following exception:
web_1 |
web_1 | Traceback (most recent call last):
web_1 | File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/base_async.py", line 55, in handle
web_1 | self.handle_request(listener_name, req, client, addr)
web_1 | File "/usr/local/lib/python3.12/site-packages/gunicorn/workers/base_async.py", line 108, in handle_request
web_1 | respiter = self.wsgi(environ, resp.start_response)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1478, in __call__
web_1 | return self.wsgi_app(environ, start_response)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1458, in wsgi_app
web_1 | response = self.handle_exception(e)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 1455, in wsgi_app
web_1 | response = self.full_dispatch_request()
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 869, in full_dispatch_request
web_1 | rv = self.handle_user_exception(e)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 867, in full_dispatch_request
web_1 | rv = self.dispatch_request()
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask/app.py", line 852, in dispatch_request
web_1 | return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/flask_login/utils.py", line 290, in decorated_view
web_1 | return current_app.ensure_sync(func)(*args, **kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/app/web/main/views.py", line 79, in test_task
web_1 | task_test.delay()
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/app/task.py", line 444, in delay
web_1 | return self.apply_async(args, kwargs)
web_1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/app/task.py", line 594, in apply_async
web_1 | return app.send_task(
web_1 | ^^^^^^^^^^^^^^
web_1 | File "/usr/local/lib/python3.12/site-packages/celery/app/base.py", line 796, in send_task
web_1 | with P.connection._reraise_as_library_errors():
web_1 | File "/usr/local/lib/python3.12/contextlib.py", line 158, in __exit__
web_1 | self.gen.throw(value)
web_1 | File "/usr/local/lib/python3.12/site-packages/kombu/connection.py", line 476, in _reraise_as_library_errors
web_1 | raise ConnectionError(str(exc)) from exc
web_1 | kombu.exceptions.OperationalError: Error -3 connecting to redis:6379. Lookup timed out.

docker-compose.yml
services:
web:
build:
context: .
args:
- redacted
dockerfile: ./docker/web/Dockerfile
command: /start
volumes:
- .:/app
expose:
- 5000
env_file:
- .env
environment:
- FLASK_APP=app
depends_on:
- redis

redis:
image: redis:7-alpine
ports:
- '6379:6379'

celery_worker:
build:
context: .
args:
- redacted
dockerfile: ./docker/web/Dockerfile
command: /start-celeryworker
volumes:
- .:/app
env_file:
- .env
environment:
- FLASK_APP=celery_app
depends_on:
- redis

celery_beat:
build:
context: .
args:
- redacted
dockerfile: ./docker/web/Dockerfile]
command: /start-celerybeat
volumes:
- .:/app
env_file:
- .env
environment:
- FLASK_APP=celery_app
depends_on:
- redis

flower:
build:
context: .
args:
- redacted
dockerfile: ./docker/web/Dockerfile
command: /start-flower
volumes:
- .:/app
env_file:
- .env
environment:
- FLASK_APP=celery_app
ports:
- '5555:5555'
depends_on:
- redis

nginx:
build:
context: .
dockerfile: ./docker/nginx/Dockerfile
ports:
- '443:443'
- '80:80'
depends_on:
- web

web > init.py
...
from flask_celeryext import FlaskCeleryExt
from web.celery_utils import make_celery

ext_celery = FlaskCeleryExt(create_celery_app=make_celery)
...

def create_app(config_name=None):
if config_name is None:
config_name = os.environ.get('FLASK_CONFIG', 'development')

app = Flask(__name__)

# set config
app.config.from_object(config[config_name])

# set up extensions
ext_celery.init_app(app)
...

# register blueprints
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
...

# shell context for flask cli
@app.shell_context_processor
def ctx():
return {'app':app, 'db':db}

return app

celery_app.py
from web import create_app, ext_celery

app = create_app(config_name='development')
celery = ext_celery.celery

app.py
from web import create_app, ext_celery

app = create_app(config_name='development')
celery = ext_celery.celery

web > config.py
import os
from pathlib import Path
from kombu import Queue
import json
from datetime import timedelta
from celery.schedules import crontab

class BaseConfig:
BASE_DIR = Path(__file__).parent.parent
TESTING = False
FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
SECRET_KEY = os.environ.get('SECRET_KEY')

BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = 'redis://redis:6379/0'
# Force all queues to be explicitly listed in 'CELERY_TASK_QUEUES' to help prevent typos
CELERY_TASK_CREATE_MISSING_QUEUES = False
CELERY_TASK_DEFAULT_QUEUE = 'default'
CELERY_TASK_QUEUES = (
Queue('default'),
Queue('high_priority'),
Queue('low_priority'),
)

CELERY_TASK_ROUTES = {
'web.main.tasks.add': {
'queue': 'default',
},
}
CELERY_BEAT_SCHEDULE = {
'send-email-reminder': {
'task': 'default:email_reminder',
'schedule': crontab(minute=0, hour=12, day_of_week='mon,wed,fri') # Time is UTC
}
}

class DevelopmentConfig(BaseConfig):
DEBUG = True
TESTING = False # When True, prevents Celery tasks from working properly (flask-mail doesnt work,
# and shared tasks like add() perform synchronously, not asynchronously).

CELERY_BEAT_SCHEDULE = {}

config = {
'development': DevelopmentConfig
}

web > main > Tasks.py
from celery import shared_task

logger = get_task_logger(__name__)

@shared_task(name='default:task_test')
def task_test():
logger.info('about to sleep...')
time.sleep(5)
logger.info('executing...')
print('abc 123')
time.sleep(5)
logger.info('done.')

web > main >views.py
from . import main
from .tasks import task_test

@main.route('/test_task', methods=['GET'])
def test_task():
print(f'{os.system(f'ping redis')=}') # returns True (after I apt install iputils-ping)

print(f'{redis.Redis(host="172.23.0.2", port=6379).ping()=}')
print(f'{redis.Redis(host="redis", port=6379).ping()=}') # fails here unless commented out, but this function executes properly in flask shell

task_test.delay() # fails here, but this function executes properly in flask shell
return ''


Подробнее здесь: https://stackoverflow.com/questions/787 ... er-compose
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу подключиться к Celery/Redis на Heroku?
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как я могу подключиться к Celery/Redis на Heroku?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Ошибка с Celery+S3 celery.Exceptions.ImproperlyConfigured: отсутствует имя сегмента
    Anonymous » » в форуме Python
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Внутренний контейнер Spring Boot не может подключиться к контейнеру Redis внутри Docker Compose
    Anonymous » » в форуме JAVA
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Внутренний контейнер Spring Boot не может подключиться к контейнеру Redis внутри Docker Compose
    Anonymous » » в форуме JAVA
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»