大家好!我正在用 Python 3.12.0 编写一个小型应用程序,并使用 Redis 作为 Celery 的消息代理(DB=0)。我还使用Redis来存储缓存(DB=1)。在开发过程中,Redis是在docker中启动的。一切都很好。现在我决定将所有内容打包到 docker-compose 中。然后问题开始了......我的 Dockerfile:
FROM python:3.12.0
LABEL authors="agrytsai"
ENV PYTHONUNBUFFERED=1
RUN pip install poetry
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN poetry install --no-dev --no-root
COPY . .
Docker 组合:
services:
app:
build:
context: .
env_file:
- .env
command: >
sh -c "poetry run python manage.py wait_for_db &&
poetry run python manage.py migrate &&
poetry run celery -A MyProject worker --pool=solo --loglevel=INFO &&
poetry run python main.py"
depends_on:
- redis
redis:
image: redis:alpine
restart: on-failure
env_file:
- .env
ports:
- "6379:6379"
volumes:
- $REDISDATA
- redis_data:/data
command: redis-server /usr/local/etc/redis/redis_cache.conf
volumes:
redis_data:
当我尝试执行时docker-compose up --build,Redis正常启动,python manage.py wait_for_db并且python manage.py migrate是一样的。然后我收到错误:
app-1 | Traceback (most recent call last):
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/bin/celery", line 8, in <module>
app-1 | sys.exit(main())
app-1 | ^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/__main__.py", line 15, in main
app-1 | sys.exit(_main())
app-1 | ^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/bin/celery.py", line 236, in main
app-1 | return celery(auto_envvar_prefix="CELERY")
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/core.py", line 1157, in __call__
app-1 | return self.main(*args, **kwargs)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/core.py", line 1078, in main
app-1 | rv = self.invoke(ctx)
app-1 | ^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/core.py", line 1688, in invoke
app-1 | return _process_result(sub_ctx.command.invoke(sub_ctx))
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/core.py", line 1434, in invoke
app-1 | return ctx.invoke(self.callback, **ctx.params)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/core.py", line 783, in invoke
app-1 | return __callback(*args, **kwargs)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/click/decorators.py", line 33, in new_func
app-1 | return f(get_current_context(), *args, **kwargs)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/bin/base.py", line 135, in caller
app-1 | return f(ctx, *args, **kwargs)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/bin/worker.py", line 348, in worker
app-1 | worker = app.Worker(
app-1 | ^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/worker/worker.py", line 93, in __init__
app-1 | self.app.loader.init_worker()
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/loaders/base.py", line 110, in init_worker
app-1 | self.import_default_modules()
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/loaders/base.py", line 104, in import_default_modules
app-1 | raise response
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/utils/dispatch/signal.py", line 276, in send
app-1 | response = receiver(signal=self, sender=sender, **named)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/vine/promises.py", line 161, in __call__
app-1 | return self.throw()
app-1 | ^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/vine/promises.py", line 158, in __call__
app-1 | retval = fun(*final_args, **final_kwargs)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/app/base.py", line 694, in _autodiscover_tasks
app-1 | return self._autodiscover_tasks_from_fixups(related_name)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/app/base.py", line 703, in _autodiscover_tasks_from_fixups
app-1 | return self._autodiscover_tasks_from_names([
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/app/base.py", line 698, in _autodiscover_tasks_from_names
app-1 | return self.loader.autodiscover_tasks(
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/loaders/base.py", line 220, in autodiscover_tasks
app-1 | mod.__name__ for mod in autodiscover_tasks(packages or (),
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/loaders/base.py", line 246, in autodiscover_tasks
app-1 | return [find_related_module(pkg, related_name) for pkg in packages]
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/celery/loaders/base.py", line 270, in find_related_module
app-1 | return importlib.import_module(module_name)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "/usr/local/lib/python3.12/importlib/__init__.py", line 90, in import_module
app-1 | return _bootstrap._gcd_import(name[level:], package, level)
app-1 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app-1 | File "<frozen importlib._bootstrap>", line 1381, in _gcd_import
app-1 | File "<frozen importlib._bootstrap>", line 1354, in _find_and_load
app-1 | File "<frozen importlib._bootstrap>", line 1325, in _find_and_load_unlocked
app-1 | File "<frozen importlib._bootstrap>", line 929, in _load_unlocked
app-1 | File "<frozen importlib._bootstrap_external>", line 994, in exec_module
app-1 | File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
app-1 | File "/app/scraping/tasks.py", line 18, in <module>
app-1 | from cache.redis import RedisService
app-1 | File "/app/cache/redis.py", line 5, in <module>
app-1 | from redis import Redis
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/redis/__init__.py", line 2, in <module>
app-1 | from redis.client import Redis, ConnectionPool
app-1 | File "/root/.cache/pypoetry/virtualenvs/prozorro-parsing-9TtSrW0h-py3.12/lib/python3.12/site-packages/redis/client.py", line 53
app-1 | except socket.error, e:
app-1 | ^^^^^^^^^^^^^^^
app-1 | SyntaxError: multiple exception types must be parenthesized
该错误表明版本不兼容。我已经安装了redis = "^5.0.8",文档说明:
**注意:** redis-py 5.0 将是支持 Python 3.7 的最后一个 redis-py 版本,因为它已达到生命周期。 redis-py 5.1 将支持 Python 3.8+。那些。 Python 3.12.0 + redis 5.0.8 完全兼容。
可能是什么问题?我已经尝试解决这个问题近一周了,但仍然无法解决(
我找到了解决方案 - 问题出在虚拟环境上。我删除了旧的,创建了一个新的,重新安装了所有的软件包,它就工作了。