Docker-Compose部署Django+Redis+Celery报错:celery不在$PATH中
问题描述
尝试用docker-compose部署Django+Redis+Celery项目时,Celery容器启动失败,报错exec: "celery": executable file not found in $PATH。
docker-compose.yml 内容
version: "3.9" services: db: container_name: my_table_postgres image: postgres ports: - 5432/tcp volumes: - my_table_postgres_db:/var/lib/postgresql/data environment: - POSTGRES_DB=my_table_postgres - POSTGRES_USER=dev - POSTGRES_PASSWORD=Ieyh5&RIR48!&8fc redis: container_name: redis image: redis my_table: container_name: my_table build: . command: python manage.py runserver 0.0.0.0:5000 volumes: - .:/api ports: - "5000:5000" depends_on: - db - redis celery: restart: always build: context: . command: ['celery', '-A', 'mytable', '-l', 'INFO'] volumes: - .:/api container_name: celery depends_on: - db - redis - my_table volumes: my_table_postgres_db: redis_data:
Dockerfile 内容
FROM python:3.11 # Managing user RUN mkdir /mytable RUN useradd -ms /bin/bash devuser USER devuser COPY . /mytable WORKDIR /mytable # Keeps Python from generating .pyc files in the container ENV PYTHONDONTWRITEBYTECODE=1 # Turns off buffering for easier container logging ENV PYTHONUNBUFFERED=1 COPY --chown=devuser:devuser requirements.txt requirements.txt RUN pip install --user --default-timeout=1000 --upgrade pip RUN pip install --user --default-timeout=1000 -r requirements.txt EXPOSE 5000 #ENV PATH="/home/devuser/.local/bin" COPY --chown=devuser:devuser . . # Run manage.py runserver when the container launches CMD ["python3", "manage.py", "runserver"]
错误信息
Recreating eda7aad3f246_celery ... error ERROR: for eda7aad3f246_celery Cannot start service celery: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "celery": executable file not found in $PATH: unknown ERROR: for celery Cannot start service celery: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "celery": executable file not found in $PATH: unknown ERROR: Encountered errors while bringing up the project.
解决方案
问题根源是使用pip install --user安装Celery后,其可执行文件位于/home/devuser/.local/bin目录,但该目录未被加入系统$PATH,导致容器无法找到celery命令。可通过以下两种方式解决:
方法1:开启Dockerfile中的PATH环境变量配置
取消Dockerfile中该行的注释,将Celery所在目录加入环境变量:
ENV PATH="/home/devuser/.local/bin:$PATH"
方法2:直接使用Celery的绝对路径执行
在docker-compose.yml的celery服务中,修改command为绝对路径:
command: ['/home/devuser/.local/bin/celery', '-A', 'mytable', '-l', 'INFO']
额外优化建议
my_table服务的卷挂载路径./api与Dockerfile中的工作目录/mytable不一致,建议统一为- .:/mytable,避免代码加载异常。- Celery服务无需依赖
my_table,可移除depends_on中的my_table项,简化启动依赖。
内容的提问来源于stack exchange,提问作者Matteo Possamai
相关产品推荐
相关产品推荐

