Отказано в разрешении при создании проекта Django с помощью Docker

Я пытаюсь создать проект Django с помощью Docker, но я всегда получаю эту ошибку и не знаю, как с ней справиться:

/usr/local/lib/python3.13/site-packages/django/coremanagement/commands
makemigrations.py:160: RuntimeWarning: Got an error checking a consistent 
migration history performed for database connection 'default': unable to open 
database file

В дальнейшем будут еще ошибки, но все они касаются разрешения на создание базы данных db.sqlite3.

docker-compose.yml:

version: "3.9"

services:
  puppint:
    build: .
    container_name: puppint_app
    ports:
      - "8000:8000"
    volumes:
      - .:/app
      - ./static:/app/static
    env_file:
      - ./api.env
    working_dir: /app
    command: >
      sh -c "python puppint.py"

Файл настройки:

FROM python:3.13-slim AS builder

RUN mkdir /app

WORKDIR /app

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

RUN pip install --upgrade pip

COPY requirements.txt /app/

RUN pip install --no-cache-dir -r requirements.txt

FROM python:3.13-slim

RUN useradd -m -r appuser && \
   mkdir /app && \
   chown -R appuser /app

COPY --from=builder /usr/local/lib/python3.13/site-packages/ /usr/local/lib/python3.13/site-packages/
COPY --from=builder /usr/local/bin/ /usr/local/bin/

WORKDIR /app

COPY --chown=appuser:appuser . .

ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

USER appuser

EXPOSE 8000

CMD ["python3 puppint.py"]

puppint.py это скрипт, который запускает миграцию. Я создал его в основном для проверки того, является ли пользователь суперпользователем или нет. puppint.py:

import os
import subprocess
from time import sleep

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'puppint.settings')

import django
django.setup()
from django.contrib.auth.models import User

def run_command(command):
    try:
        subprocess.run(command, shell=True, check=True)
    except subprocess.CalledProcessError as e:
        print(f"Error when executing '{command}': {e}")

def check_superuser():
    if not User.objects.filter(is_superuser=True).exists():
        print("No superuser in database!\n")
        username = input("Enter username: ")
        email = input("Enter e-mail: ")
        password = input("Enter password: ")
        User.objects.create_superuser(username, email, password)

def main():

    print_banner()
    sleep(1)

    run_command("python manage.py makemigrations app")
    run_command("python manage.py migrate")
    run_command("python manage.py collectstatic --noinput")

    check_superuser()

    run_command("python manage.py runserver 0.0.0.0:8000")

if __name__ == "__main__":
    main()

Знаете ли вы, как я могу разрешить это разрешение для создания базы данных и т.д. при создании приложения Django? Спасибо!

Эта ошибка возникает из-за того, что контейнер Docker пытается создать файл db.sqlite3 или выполнить запись в него, но у пользователя, от имени которого он запущен (appuser), нет разрешений. Обычно это происходит, когда вы монтируете свой локальный каталог проекта (.) в контейнер (/app), что переопределяет права доступа к внутренней папке. Чтобы исправить это, вы можете либо запустить контейнер как root, изменить права доступа к вашей локальной папке на chmod -R 777 ., либо убедиться, что каталог /app внутри контейнера принадлежит нужному пользователю, используя COPY --chown=appuser:appuser . . и при необходимости установите разрешения на запись.

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