Необходимо быть суперпользователем для редактирования файла приложения django. Проект django имеет Docker-контейнер

Я клонировал, следовал инструкциям и установил проект Docker, Django, Postgres с Github Docker на моей машине Linux. Я использовал docker compose run web django-admin startapp auth для настройки каталога приложения. Когда я редактирую файл в auth, например auth/models.py, я получаю сообщение об ошибке недостаточных разрешений. Insufficient permissions error message

auth/ принадлежит root, что сбивает с толку, потому что manage.py принадлежит мне. Я запустил sudo chown -R $USER:$USER composeexample manage.py в соответствии с инструкциями ReadMe.

Я не хочу, чтобы мне приходилось chown каждое новое приложение, которое я создаю.

Мой пользователь является членом группы docker.

getent group docker возвращает docker:x:998:meeee

Это распространенная проблема в системах разработки, использующих Docker (и Docker Compose), когда ваш контейнер запускается как root. Вероятно, вы монтируете том в своей установке Docker, таким образом записывая из контейнера в локальную файловую систему, например

docker run --rm -it -v .:/app ubuntu:rolling

или, как установка Docker Compose (docker-compose.yml),

services:
  app:
    image: ubuntu:rolling
    volumes:
    - .:/app

Проблема в том, что ваш контейнер работает как root, следовательно, файлы, созданные на томе внутри вашего контейнера, принадлежат root (внутри и вне вашего контейнера, из-за тома).

Использовать непривилегированного пользователя

Вы можете исправить это, запустив контейнер с непривилегированным пользователем, например

docker run --rm -it -u ${UID} -v .:/app ubuntu:rolling python manage.py

или

docker compose run -u ${UID} app python manage.py

Установите USER в вашем Dockerfile

Обратите внимание, что лучшие практики в области Docker рекомендуют настроить образ Docker на запуск от имени непривилегированного пользователя, задав USER в Dockerfile, например

FROM ubuntu:rolling
RUN apt update && apt install -y python3-pip
WORKDIR /app
USER ubuntu
RUN pip install django
COMMAND python manage.py runserver

Подобная настройка позволяет устанавливать системные зависимости как root, а программы пользовательского пространства - как непривилегированный пользователь, которого контейнер будет использовать и при последующем запуске контейнера.

Хотя это необязательно для решения вашей проблемы (если вы всегда запускаете Docker с опцией -u), это настоятельно рекомендуется, поскольку делает вашу установку более безопасной.

Вернуться на верх