Я следовал руководству по созданию Django REST Framework API с помощью Docker и успешно запустил проект с первой попытки, но потом невозможно воссоздать его из-за PermissionError
.
Структура каталогов выглядит следующим образом:
project_directory
- Dockerfile
- docker-compose.yml
- requirements.txt
- app/ # this directory was created manually
Успешная конфигурация выглядит следующим образом:
Dockerfile:
FROM python:3.7-alpine
LABEL author="aqv"
ENV PYTHONUNBUFFERED 1
COPY ./requirements.txt /requirements.txt
RUN apk add --update --no-cache postgresql-client
RUN apk add --update --no-cache --virtual .tmp-build-deps \
gcc libc-dev linux-headers postgresql-dev
RUN pip install -r /requirements.txt
RUN apk del .tmp-build-deps
RUN mkdir /app
WORKDIR /app
COPY ./app /app
RUN adduser -D user
USER user
requirements.txt:
Django>=2.1.3,<2.2.0
djangorestframework>=3.9.0,<3.10.0
psycopg2>=2.7.5,<2.8.0
docker-compose.yml:
version: "3"
services:
app:
build:
context: .
ports:
- "3005:8000"
volumes:
- ./app:/app
command: >
sh -c "python manage.py wait_for_db &&
python manage.py migrate &&
python manage.py runserver 0.0.0.0:8000"
environment:
- DB_HOST=db
- DB_NAME=app
- DB_USER=postgresuser
- DB_PASS=<pass>
depends_on:
- db
db:
image: postgres:10-alpine
environment:
- POSTGRES_DB=app
- POSTGRES_USER=postgresuser
- POSTGRES_PASSWORD=<pass>
Сначала выполнялся шаг (1) docker build .
в каталоге проекта, затем пришел (2) docker-compose build
(что делало 1-ю команду избыточной, но ничего не нарушало) и, наконец, (3) docker-compose run app sh -c "django-admin.py startproject app ."
.
Последняя команда теперь заканчивается на:
Starting project_t_db_1 ... done
Traceback (most recent call last):
File "/usr/local/bin/django-admin.py", line 5, in <module>
management.execute_from_command_line()
File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 3.7, in run_from_argv
self.execute(*args, **cmd_options)
File "/usr/local/lib/python3.7/site-packages/django/core/management/base.py", line 353, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python3.7/site-packages/django/core/management/commands/startproject.py", line 20, in handle
super().handle('project', project_name, target, **options)
File "/usr/local/lib/python3.7/site-packages/django/core/management/templates.py", line 155, in handle
with open(new_path, 'w', encoding='utf-8') as new_file:
PermissionError: [Errno 13] Permission denied: '/app/manage.py'
Каталог /app
пуст, в списке project_directory
указаны только файлы, поэтому /app/manage.py
не существует.
Попытки перезапустить создание проекта были предприняты на машине с Windows 10 (как CMD, так и PowerShell, в том числе запущенной с правами администратора), Ubuntu в Windows и удаленном сервере Ubuntu. Владение файлами и каталогами было проверено как root
, так и обычным пользователем.
Все контейнеры Docker были уничтожены (docker kill $(docker ps -q)
), удалены изображения (docker rm $(docker ps -a -q)
и docker rmi $(docker images -q)
), а создание среды было запущено с нуля.
Я заметил, что могу успешно создать проект на вновь настроенном сервере. Но при попытке создать другую или заменить существующую другой проблема снова возникает.
Что бы вы предложили проверить?