Docker-Compose运行Celery Worker时出现源码含空字节错误求助
问题:Docker中运行Celery报错“源码字符串不能包含空字节”,本地VS Code运行正常
环境信息
使用的Dockerfile
FROM tiangolo/uvicorn-gunicorn:python3.10-slim COPY . /app WORKDIR /app RUN pip install -r requirements.txt CMD celery worker -B --app=worker.worker.celery --loglevel=debug
报错信息
momo-api-worker-1 | During handling of the above exception, another exception occurred: momo-api-worker-1 | momo-api-worker-1 | Traceback (most recent call last): momo-api-worker-1 | File "/usr/local/bin/celery", line 8, in <module> momo-api-worker-1 | sys.exit(main()) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/__main__.py", line 16, in main momo-api-worker-1 | _main() momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/celery.py", line 322, in main momo-api-worker-1 | cmd.execute_from_commandline(argv) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/celery.py", line 499, in execute_from_commandline momo-api-worker-1 | super(CeleryCommand, self).execute_from_commandline(argv))) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/base.py", line 289, in execute_from_commandline momo-api-worker-1 | argv = self.setup_app_from_commandline(argv) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/base.py", line 509, in setup_app_from_commandline momo-api-worker-1 | self.app = self.find_app(app) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/base.py", line 531, in find_app momo-api-worker-1 | return find_app(app, symbol_by_name=self.symbol_by_name) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/app/utils.py", line 373, in find_app momo-api-worker-1 | sym = symbol_by_name(app, imp=imp) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/bin/base.py", line 534, in symbol_by_name momo-api-worker-1 | return imports.symbol_by_name(name, imp=imp) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/kombu/utils/imports.py", line 59, in symbol_by_name momo-api-worker-1 | reraise(ValueError, momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/vine/five.py", line 194, in reraise momo-api-worker-1 | raise value.with_traceback(tb) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/kombu/utils/imports.py", line 57, in symbol_by_name momo-api-worker-1 | module = imp(module_name, package=package, **kwargs) momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/celery/utils/imports.py", line 111, in import_from_cwd momo-api-worker-1 | return imp(module, package=package) momo-api-worker-1 | File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module momo-api-worker-1 | return _bootstrap._gcd_import(name[level:], package, level) momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 1050, in _gcd_import momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 1027, in _find_and_load momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 1050, in _gcd_import momo-api-flower-1 | [I 230214 17:01:48 mixins:225] Connected to redis://redis:6379/0 momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 1027, in _find_and_load momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 688, in _load_unlocked momo-api-worker-1 | File "<frozen importlib._bootstrap_external>", line 883, in exec_module momo-api-worker-1 | File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed momo-api-worker-1 | File "/app/worker/__init__.py", line 1, in <module> momo-api-worker-1 | from .worker import celery momo-api-worker-1 | File "/app/worker/worker.py", line 5, in <module> momo-api-worker-1 | from container import init_container momo-api-worker-1 | File "/app/container.py", line 15, in <module> momo-api-worker-1 | from services import * momo-api-worker-1 | File "/app/services/__init__.py", line 2, in <module> momo-api-worker-1 | from .push_notifications import * momo-api-worker-1 | File "/app/services/push_notifications.py", line 1, in <module> momo-api-worker-1 | from exponent_server_sdk import PushClient, PushMessage momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/exponent_server_sdk/__init__.py", line 4, in <module> momo-api-worker-1 | import requests momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/requests/__init__.py", line 147, in <module> momo-api-worker-1 | from . import packages, utils momo-api-worker-1 | File "/usr/local/lib/python3.10/site-packages/requests/packages.py", line 16, in <module> momo-api-worker-1 | locals()[package] = __import__(package) momo-api-worker-1 | ValueError: Couldn't import 'worker.worker.celery': source code string cannot contain null bytes
VS Code本地启动配置(运行正常)
{ "name": "Worker", "type": "python", "request": "launch", "module": "celery", "args": [ "worker", "-B", "--app=worker.worker.celery", "--loglevel=debug" ], "jinja": true, "justMyCode": true }
原因分析
- 冗余文件带入容器:本地开发环境的缓存文件(如
__pycache__、.pyc)、编辑器临时文件或隐藏文件被COPY . /app指令复制到容器,部分文件包含空字节,触发Python导入错误。 - 依赖包损坏:容器内安装依赖时,网络不稳定导致包下载不完整,使得
requests等库的源码文件出现损坏,包含空字节。 - 文件编码不兼容:本地与容器的文件系统编码存在差异,文件复制过程中出现字节转换错误,引入空字节。
解决方法
方法一:排除冗余文件
- 在项目根目录创建
.dockerignore文件,添加以下内容:
__pycache__/ *.pyc *.pyo *.pyd .env .vscode/ .git/ .DS_Store *.swp *.swo
- 重新构建镜像:
docker-compose build
方法二:确保依赖安装完整
修改Dockerfile,升级pip并清理缓存,避免安装损坏的包:
FROM tiangolo/uvicorn-gunicorn:python3.10-slim COPY . /app WORKDIR /app RUN pip install --upgrade pip && \ pip install -r requirements.txt --no-cache-dir && \ rm -rf /root/.cache/pip CMD celery worker -B --app=worker.worker.celery --loglevel=debug
方法三:检查并修复损坏文件
- 进入容器:
docker exec -it momo-api-worker-1 /bin/bash
- 检查报错涉及的文件是否存在空字节(以
requests/packages.py为例):
grep -P '\x00' /usr/local/lib/python3.10/site-packages/requests/packages.py
- 若发现空字节,重新安装对应包:
pip install --force-reinstall requests
方法四:精准复制必要文件
避免复制整个目录,仅复制项目必需的源码文件,减少冗余:
FROM tiangolo/uvicorn-gunicorn:python3.10-slim WORKDIR /app # 先复制依赖文件,利用Docker缓存 COPY requirements.txt . RUN pip install --upgrade pip && pip install -r requirements.txt --no-cache-dir # 复制核心源码目录 COPY worker/ ./worker/ COPY container.py ./ COPY services/ ./services/ CMD celery worker -B --app=worker.worker.celery --loglevel=debug
内容的提问来源于stack exchange,提问作者Dirk
相关产品推荐
相关产品推荐

