Я могу без проблем запускать общие задачи сельдерея в оболочке контейнера 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
Flask не может подключиться к Redis и Celery с помощью Docker-Compose ⇐ Python
Программы на Python
1721830558
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.
[b]docker-compose.yml[/b]
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
[b]web > init[/b].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
[b]celery_app.py[/b]
from web import create_app, ext_celery
app = create_app(config_name='development')
celery = ext_celery.celery
[b]app.py[/b]
from web import create_app, ext_celery
app = create_app(config_name='development')
celery = ext_celery.celery
[b]web > config.py[/b]
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
}
[b]web > main > Tasks.py[/b]
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.')
[b]web > main >views.py[/b]
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 ''
Подробнее здесь: [url]https://stackoverflow.com/questions/78788700/flask-unable-to-connect-to-redis-celery-with-docker-compose[/url]
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу подключиться к Celery/Redis на Heroku?
Anonymous » » в форуме PythonКаждый раз, когда я вызываю конечную точку API, использующую Celery, я получаю:
ERROR:celery.backends.redis:Connection to Redis lost: Retry (0/20) now.
Я не понимаю, потому что на моей локальной машине все работает, но не на Heroku.
Я настроил среду... - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как я могу подключиться к Celery/Redis на Heroku?
Anonymous » » в форуме PythonКаждый раз, когда я вызываю конечную точку API, использующую Celery, я получаю:
ERROR:celery.backends.redis:Connection to Redis lost: Retry (0/20) now.
Я не понимаю, потому что на моей локальной машине все работает, но не на Heroku.
Я настроил среду... - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Ошибка с Celery+S3 celery.Exceptions.ImproperlyConfigured: отсутствует имя сегмента
Anonymous » » в форуме PythonЭто мой сценарий для использования сельдерея на SQS и S3 в качестве серверной части результата:
from celery import Celery
from celery.backends.s3 import S3Backend
# Set your SQS queue URL
sqs_queue_url = '
app = Celery('tasks')... - 0 Ответы
- 28 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Внутренний контейнер Spring Boot не может подключиться к контейнеру Redis внутри Docker Compose
Anonymous » » в форуме JAVAЯ уверен, что все контейнеры находятся в одной сети.
Я могу подключиться к redisContainer с помощью redis-cli
Если я запущу приложение Spring Boot из ide (не в докер-контейнере), все в порядке.
Я получаю только это сообщение об ошибке ниже, без... - 0 Ответы
- 33 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Внутренний контейнер Spring Boot не может подключиться к контейнеру Redis внутри Docker Compose
Anonymous » » в форуме JAVAЯ уверен, что все контейнеры находятся в одной сети.
Я могу подключиться к redisContainer с помощью redis-cli
Если я запущу приложение Spring Boot из ide (не в докер-контейнере), все в порядке.
Я получаю только это сообщение об ошибке ниже, без... - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...