ModulenotFoundError在Django项目中启动芹菜时
我有这样的Django项目结构(没有显示所有文件/文件夹):
myproj/
├── __init__.py
├── config/
│ ├── __init__.py <-- imports `celery_app` as per docs
│ ├── settings/
│ │ ├── __init__.py
│ │ └── base.py
│ ├── celery.py <-- defines `app = Celery("myproj")`
│ └── wsgi.py
├── myapp1/
└── myapp2/
我有一个设置Web和Worker服务的Docker-compose.yml
,Worker Service是类似的:
worker:
build:
context: "."
target: "app"
command: celery -A config worker -l info
entrypoint: []
但是无论我尝试-A
启动芹菜时,我都会获得模块化。我已经尝试了config
,myproj.config
和myproj
。我尝试添加- workdir =/path/to/myproj
,但没有欢乐。
更新带有-a config
我得到的:
oohdir-worker-1 | Usage: celery [OPTIONS] COMMAND [ARGS]...
oohdir-worker-1 | Try 'celery --help' for help.
oohdir-worker-1 |
oohdir-worker-1 | Error: Invalid value for '-A' / '--app':
oohdir-worker-1 | Unable to load celery application.
oohdir-worker-1 | The module config was not found.
oohdir-worker-1 exited with code 2
但是使用-a myproj.config
我得到了:
myproj-worker-1 | Usage: celery [OPTIONS] COMMAND [ARGS]...
myproj-worker-1 | Try 'celery --help' for help.
myproj-worker-1 |
myproj-worker-1 | Error: Invalid value for '-A' / '--app':
myproj-worker-1 | Unable to load celery application.
myproj-worker-1 | While trying to load the module myproj.config the following error occurred:
myproj-worker-1 | Traceback (most recent call last):
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/bin/celery.py", line 57, in convert
myproj-worker-1 | return find_app(value)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/app/utils.py", line 384, in find_app
myproj-worker-1 | sym = symbol_by_name(app, imp=imp)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/kombu/utils/imports.py", line 56, in symbol_by_name
myproj-worker-1 | module = imp(module_name, package=package, **kwargs)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/utils/imports.py", line 105, in import_from_cwd
myproj-worker-1 | return imp(module, package=package)
myproj-worker-1 | File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
myproj-worker-1 | return _bootstrap._gcd_import(name[level:], package, level)
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
myproj-worker-1 | ModuleNotFoundError: No module named 'myproj'
myproj-worker-1 |
myproj-worker-1 exited with code 2
I have a Django project structure like this (not showing all the files/folders):
myproj/
├── __init__.py
├── config/
│ ├── __init__.py <-- imports `celery_app` as per docs
│ ├── settings/
│ │ ├── __init__.py
│ │ └── base.py
│ ├── celery.py <-- defines `app = Celery("myproj")`
│ └── wsgi.py
├── myapp1/
└── myapp2/
I have a docker-compose.yml
that sets up web and worker services, and the worker service is something like:
worker:
build:
context: "."
target: "app"
command: celery -A config worker -l info
entrypoint: []
But whatever I try for the -A
when starting celery I get ModuleNotFound. I've tried config
, myproj.config
and myproj
. I've tried adding --workdir=/path/to/myproj
, but no joy.
UPDATE With -A config
I get this:
oohdir-worker-1 | Usage: celery [OPTIONS] COMMAND [ARGS]...
oohdir-worker-1 | Try 'celery --help' for help.
oohdir-worker-1 |
oohdir-worker-1 | Error: Invalid value for '-A' / '--app':
oohdir-worker-1 | Unable to load celery application.
oohdir-worker-1 | The module config was not found.
oohdir-worker-1 exited with code 2
But with -A myproj.config
I get this:
myproj-worker-1 | Usage: celery [OPTIONS] COMMAND [ARGS]...
myproj-worker-1 | Try 'celery --help' for help.
myproj-worker-1 |
myproj-worker-1 | Error: Invalid value for '-A' / '--app':
myproj-worker-1 | Unable to load celery application.
myproj-worker-1 | While trying to load the module myproj.config the following error occurred:
myproj-worker-1 | Traceback (most recent call last):
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/bin/celery.py", line 57, in convert
myproj-worker-1 | return find_app(value)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/app/utils.py", line 384, in find_app
myproj-worker-1 | sym = symbol_by_name(app, imp=imp)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/kombu/utils/imports.py", line 56, in symbol_by_name
myproj-worker-1 | module = imp(module_name, package=package, **kwargs)
myproj-worker-1 | File "/home/python/.local/lib/python3.10/site-packages/celery/utils/imports.py", line 105, in import_from_cwd
myproj-worker-1 | return imp(module, package=package)
myproj-worker-1 | File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
myproj-worker-1 | return _bootstrap._gcd_import(name[level:], package, level)
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
myproj-worker-1 | File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
myproj-worker-1 | ModuleNotFoundError: No module named 'myproj'
myproj-worker-1 |
myproj-worker-1 exited with code 2
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
调用
芹菜
时,您需要确保项目文件在工作目录中。在您的Dockerfile的情况下,这通常意味着将您的WorkDir
设置为复制项目文件的同一位置。例如:确保此操作始终正确起作用的另一种方法是为您的Django项目创建
setup.py
并使用PIP安装它(而不是复制项目文件)。这样,您的应用程序和工人都应该能够被调用,而不论工作目录如何,因为它可以从站点包装中导入。使用多阶段Docker构建的示例:
You need to make sure that your project files are in the working directory when calling
celery
. In the case of your Dockerfile, this usually means setting yourWORKDIR
to the same location where you copy your project files. For example:Another way to ensure this always works correctly would be to create a
setup.py
for your django project and install it using pip (instead of copying the project files). That way, your app and worker should be able to be invoked irrespective of the working directory because it'll be importable from site-packages.Example of this using a multi-stage docker build: