Отказано в разрешении при создании проекта 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 . . и при необходимости установите разрешения на запись.