PermissionError: [Errno 13] Отказано в доступе: '/app/manage.py' при попытке создать проект с помощью docker-compose - PullRequest
0 голосов
/ 17 апреля 2019

Я следовал руководству по созданию 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)), а создание среды было запущено с нуля.

Я заметил, что могу успешно создать проект на вновь настроенном сервере. Но при попытке создать другую или заменить существующую другой проблема снова возникает.

Что бы вы предложили проверить?

1 Ответ

0 голосов
/ 24 июня 2019

Я столкнулся с той же проблемой. Я обнаружил, что это связано с тем, что брандмауэр Windows (или сторонний) блокирует обмен файлами между Windows и Docker. Когда я попытался открыть общий доступ к дискам «C» и «D» Windows в настройках Docker, появилось следующее сообщение: (сообщение об ошибке от Docker) , и я не смог открыть общий доступ к дискам.

В документации Docker они предложили открыть TCP-порт 445 для докеров, чтобы разрешить общий доступ к файлам. Я использовал Kaspersky для безопасности, поэтому я искал способы открыть порт TCP в брандмауэре Kaspersky. Я нашел свое решение в этой ссылке . Вы также можете найти другие решения этой проблемы на этой странице stackoverflow .

После того, как я успешно поделился дисками между Windows и Docker, проблема решена.

...