Сельдерей не запускается в docker

#python #docker #celery #dbm

#python #docker #сельдерей #dbm

Вопрос:

Я запускаю сельдерей, используя следующий файл Dockerfile:

 FROM python:3.7-alpine

RUN apk add --no-cache postgresql-libs amp;amp; 
    apk add --no-cache gcc musl-dev postgresql-dev zlib-dev jpeg-dev amp;amp; 
    apk add --no-cache graphviz-dev # some required by my project libs

ADD ./project/requirements.txt /
RUN pip3 install -r /requirements.txt
ADD ./project /app

RUN adduser -S celery
USER celery

WORKDIR /app
CMD ["/usr/local/bin/celery", "-A", "project", "worker", "--concurrency", "20", "-E", "-l", "info", "--statedb=/celery/celery.state"]
  

Когда я запускаю его, он не запускается с ошибкой: KeyError: 'db' . Полная трассировка (я запустил сельдерей с -l debug ):

 project_celery | [2019-04-04 16:27:51,178: DEBUG/MainProcess] | Worker: Preparing bootsteps.
project_celery | [2019-04-04 16:27:51,182: DEBUG/MainProcess] | Worker: Building graph...
project_celery | [2019-04-04 16:27:51,183: DEBUG/MainProcess] | Worker: New boot order: {StateDB, Timer, Hub, Pool, Autoscaler, Beat, Consumer}
project_celery | Traceback (most recent call last):
project_celery |   File "/usr/local/lib/python3.7/site-packages/kombu/utils/objects.py", line 42, in __get__
project_celery |     return obj.__dict__[self.__name__]
project_celery | KeyError: 'db'
project_celery |
project_celery | During handling of the above exception, another exception occurred:
project_celery |
project_celery | Traceback (most recent call last):
project_celery |   File "/usr/local/bin/celery", line 10, in <module>
project_celery |     sys.exit(main())
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/__main__.py", line 16, in main
project_celery |     _main()
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 322, in main
project_celery |     cmd.execute_from_commandline(argv)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 496, in execute_from_commandline
project_celery |     super(CeleryCommand, self).execute_from_commandline(argv)))
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 275, in execute_from_commandline
project_celery |     return self.handle_argv(self.prog_name, argv[1:])
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 488, in handle_argv
project_celery |     return self.execute(command, argv)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/celery.py", line 420, in execute
project_celery |     ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/worker.py", line 223, in run_from_argv
project_celery |     return self(*args, **options)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/base.py", line 238, in __call__
project_celery |     ret = self.run(*args, **kwargs)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bin/worker.py", line 257, in run
project_celery |     **kwargs)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/worker.py", line 101, in __init__
project_celery |     self.setup_instance(**self.prepare_args(**kwargs))
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/worker.py", line 141, in setup_instance
project_celery |     self.blueprint.apply(self, **kwargs)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bootsteps.py", line 214, in apply
project_celery |     step.include(parent)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bootsteps.py", line 343, in include
project_celery |     return self._should_include(parent)[0]
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/bootsteps.py", line 339, in _should_include
project_celery |     return True, self.create(parent)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/components.py", line 215, in create
project_celery |     w._persistence = w.state.Persistent(w.state, w.statedb, w.app.clock)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/state.py", line 189, in __init__
project_celery |     self.merge()
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/state.py", line 197, in merge
project_celery |     self._merge_with(self.db)
project_celery |   File "/usr/local/lib/python3.7/site-packages/kombu/utils/objects.py", line 44, in __get__
project_celery |     value = obj.__dict__[self.__name__] = self.__get(obj)
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/state.py", line 266, in db
project_celery |     return self.open()
project_celery |   File "/usr/local/lib/python3.7/site-packages/celery/worker/state.py", line 193, in open
project_celery |     self.filename, protocol=self.protocol, writeback=True,
project_celery |   File "/usr/local/lib/python3.7/shelve.py", line 243, in open
project_celery |     return DbfilenameShelf(filename, flag, protocol, writeback)
project_celery |   File "/usr/local/lib/python3.7/shelve.py", line 227, in __init__
project_celery |     Shelf.__init__(self, dbm.open(filename, flag), protocol, writeback)
project_celery |   File "/usr/local/lib/python3.7/dbm/__init__.py", line 94, in open
project_celery |     return mod.open(file, flag, mode)
project_celery | _gdbm.error: [Errno 13] Permission denied
  

Я попытался запустить его только с python:3.7 базового изображения, но возникает та же ошибка.

Что не так?

Комментарии:

1. Ваша ошибка «Отказано в разрешении», поэтому это означает, что у пользователя celery недостаточно прав для доступа к какому-либо файлу. Может ли ваш пользователь создать этот файл: /celery/celery.state ?

2. Какая у вас версия сельдерея?

3. @marke Я использую последнюю версию celery 4.3.0

4. Да, если бы это была более старая версия, я бы сказал, попробуйте python3.6, но 4.3.0, я думаю, подходит для python3.7. С помощью какой команды вы создаете контейнер docker?

Ответ №1:

Попробуйте добавить что-то подобное в свой файл Dockerfaile:

 RUN mkdir /celery amp;amp; chown celery /celery
  

Комментарии:

1. На самом деле, /celery это папка тома, поэтому AFAIK я не могу изменить ее разрешения. Кроме того, не является ли ошибка KeyError и Permission denied просто следствием?

2. Вы можете проверить это, отключив директиву USER celery в dockerfile для запуска вашего приложения от имени root, если все будет в порядке, ваша основная причина Permission denied , и вы должны найти, к какому файлу нельзя получить доступ

3. проблема действительно была в разрешениях. Я исправил это, запустив chmod -R 777 на своих томах, чтобы пользователь сельдерея мог читать и записывать данные на этом томе