首页 > 解决方案 > Docker + Celery 告诉我不要以 root 身份运行,但一旦我不这样做,我就没有运行权限

问题描述

我有一个 Django (2.1.2) Docker 项目,我尝试包含 Celery (4.2.1),由于权限错误,该项目最终将退出 0。

码头工人-compose.yml

...
celery:
  build: .
  command: celery worker -A core --workdir /opt/services/web_app/src -l info
  volumes:
    - .:/opt/services/web_app/src
  depends_on:
    - database1
    - redis

在我使用“docker-compose build”构建然后运行“docker-compose up”后,我收到以下错误消息:

celery_1  | /usr/local/lib/python3.7/site-packages/celery/platforms.py:796:
celery_1  | RuntimeWarning: You're running the worker with superuser privileges: this 
celery_1  | is absolutely not recommended!
celery_1  |
celery_1  | Please specify a different user using the --uid option

所以.. 我什至不知道 Docker 有“用户”,所以我在公开之前将它添加到底部的“Dockerfile”中。

...
RUN groupadd -g 999 celery && \
    useradd -r -u 999 -g celery celery
USER celery

EXPOSE 8000

然后用用户更新“Dockerfile”:

...
celery:
  build: .
  command: celery worker -A core --workdir /opt/services/web_app/src -l info --uid=celery
  volumes:
    - .:/opt/services/web_app/src
  depends_on:
    - database1
    - redis

当我现在运行它时,我收到错误消息:

celery_1  | File "/usr/local/lib/python3.7/site-packages/celery/platforms.py", line 502,
celery_1  | in initgroups return os.initgroups(username, gid)
celery_1  | PermissionError: [Errno 1] Operation not permitted

标签: pythondjangodockerpermissionscelery

解决方案


  1. 如果要指定 a uid,请使用multi命令,而不是,并以 root 身份worker运行命令。multi如果要使用worker,只需运行不带uid.
  2. 1如果仅用于本地开发,您也可以将 C_FORCE_ROOT 环境变量设置为并在 docker 中以 root 身份运行。

注意,您可能还需要更新文件权限,以防您的 celery 任务将任何内容写入文件系统(如日志文件或临时文件)。


推荐阅读