Ошибка № 13 В разрешении отказано: ‘/app/celerybeat.pid’ в Docker Celery Beat

#django #docker #docker-compose #django-celery #celerybeat

#джанго #докер #docker-создать #джанго-сельдерей #сельдерейный биток

Вопрос:

Celery Beat вызывает ошибку разрешения, когда я пытаюсь запустить контейнеры docker. Это связано с правами пользователя в файле Docker, поэтому, похоже, я настроил там что-то не так. Я перепробовал все возможные решения, но ошибка все еще появлялась. Пожалуйста, помогите мне разобраться, что я делаю не так. Спасибо.

Вот файл Docker:

 FROM python:3.7-alpine

ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client jpeg-dev
RUN apk add --update --no-cache --virtual .tmp-build-deps  
    gcc libc-dev linux-headers postgresql-dev musl-dev zlib zlib-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps

RUN mkdir /app
COPY ./app /app
WORKDIR /app
    
RUN adduser -D appuser
RUN chown -R appuser:appuser /app
RUN chmod -R 755 /app/staticfiles

USER appuser
 

и docker-создать файл:

 version: '3'

services:
  app:
    build:
      context: .
    env_file:
      - ./.env.dev
    volumes:
      - ./app:/app
      - static_volume_app:/app/staticfiles
      - media_volume_app:/app/media
    command: >
      sh -c "python3 manage.py migrate amp;amp;
             python3 manage.py wait_for_db amp;amp;
             gunicorn app.wsgi:application --bind 0.0.0.0:8000"
    expose:
      - "8000"
    depends_on:
      - db           
  db:
    image: postgres:10-alpine
    env_file:
      - ./.env.dev
    ports:
      - "5432:5432"
    volumes: 
      - pgdata:/var/lib/postgresql/data
  redis:
    image: redis:alpine
  celery:
    restart: always
    build:
      context: .
    command: celery -A app worker -l info
    volumes:
      - ./app:/app
    env_file:
      - ./.env.dev
    depends_on:
      - db
      - redis
      - app
  celery-beat:
    build:
      context: .
    command: celery -A app beat -l info
    volumes:
      - ./app:/app
    env_file:
      - ./.env.dev
    depends_on:
      - db
      - redis
      - app
  nginx:
    restart: always
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    volumes:
      - static_volume_app:/app/staticfiles
      - media_volume_app:/app/media
    ports:
      - "80:80"
    depends_on: 
      - app
volumes:
  pgdata:
  static_volume_app:
  media_volume_app:
 

и полное сообщение об ошибке:

 celery.platforms.LockFailed: [Errno 13] Permission denied: '/app/celerybeat.pid'
 

Когда я комментирую последние 4 строки в файле Docker, который является пользовательскими конфигурациями, он работает нормально.

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

1. volumes: Строки перезаписывают все, что устанавливает Dockerfile, с разными файлами и разными разрешениями. В частности RUN chmod , скрытый и (числовой) владелец файла на хосте будет иметь приоритет. Я бы рекомендовал удалить их volumes: и command: переопределить, чтобы использовать то, что встроено в изображение.

Ответ №1:

На самом деле, это сработало, изменив пользователя в службе celery beat:

 celery-beat:
    build:
      context: .
    user: root
    command: celery -A app beat -l info
    volumes:
      - ./app:/app
    env_file:
      - ./.env.dev
    depends_on:
      - db
      - redis
      - app