1
votes

PermissionError: [Errno 13] Permission refusée: '/app/manage.py' lors de la tentative de création d'un projet avec docker-compose

La structure des répertoires ressemble à ceci:

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'

La configuration réussie ressemble à ceci:

Dockerfile: p >

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>

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: code >

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

La première étape consistait à exécuter (1) docker build. dans le répertoire du projet, puis est venu (2) docker-compose build (qui a rendu la première commande redondante, mais n'a rien cassé) et finalement (3) docker-compose run app sh -c "django-admin.py startproject app." .

La dernière commande se termine maintenant par:

project_directory
  - Dockerfile
  - docker-compose.yml
  - requirements.txt
  - app/ # this directory was created manually

Le répertoire / app est vide, seuls les fichiers sont répertoriés dans le project_directory ci-dessus, donc /app/manage.py n'est pas xist.

Les tentatives de réexécution de la création du projet ont été effectuées sur une machine Windows 10 (CMD et PowerShell, y compris exécuté en tant qu'administrateur), Ubuntu sur Windows et un serveur Ubuntu distant. La propriété des fichiers et des répertoires a été vérifiée à la fois avec root et avec l'utilisateur normal.

Tous les conteneurs Docker ont été tués ( docker kill $ (docker ps -q) ), les images ont été supprimées ( docker rm $ (docker ps -a -q) et docker rmi $ (docker images -q) ) et la création de l'environnement a été exécutée à partir de scratch.

J'ai observé que je peux créer avec succès le projet sur un serveur nouvellement installé. Mais lorsque vous essayez d'en créer un autre ou de remplacer l'existant par un autre, le problème se pose à nouveau.

Que suggéreriez-vous de vérifier?


5 commentaires

peut-être l'une des fois où vous exécutez docker avec sudo? et il crée un objet en tant que root?


La directive volumes: masque l'installation du logiciel dans le Dockerfile . Votre conteneur fonctionne-t-il si vous supprimez les volumes: ?


@BearBrown: cela pourrait être une bonne piste. Que faut-il vérifier dans ce cas? @DavidMaze: après avoir commenté la partie volumes et reconstruit la configuration, la même chose s'est produite: une erreur de permission.


essayez de vérifier le chemin du volume dans le système hôte par ls -lh


@BearBrown: le propriétaire est défini comme mon utilisateur régulier, pas comme utilisateur root. En attendant, j'ai réussi à surmonter l'erreur sur un serveur Linux pur en ajoutant mon utilisateur au groupe docker : sudo groupadd docker (au cas où il n'existerait pas) puis sudo usermod -aG docker $ USER . Et se déconnecter et se reconnecter.


3 Réponses :


0
votes

J'ai rencontré le même problème. J'ai découvert que cela était dû au pare-feu de Windows (ou de tiers) bloquant le partage de fichiers entre Windows et Docker. Lorsque j'ai essayé de partager le lecteur 'C' et 'D' de Windows dans les paramètres de Docker, le message suivant est apparu, (message d'erreur de Docker) et je n'ai pas pu partager de lecteurs.

Dans la documentation de Docker , ils ont suggéré d'ouvrir le port TCP 445 pour les dockers, pour permettre le partage de fichiers. J'ai utilisé Kaspersky pour la sécurité, j'ai donc cherché des moyens d'ouvrir le port TCP dans le pare-feu de Kaspersky. J'ai trouvé ma solution dans ce lien . Vous pouvez également trouver d'autres solutions à ce problème dans ce page stackoverflow également.

Après avoir partagé avec succès des lecteurs entre Windows et Docker, le problème a été résolu.


0 commentaires

1
votes

Je crée le répertoire de l'application en tant que répertoire de base des utilisateurs - de cette façon, l'utilisateur dispose des autorisations appropriées pour cela

RUN adduser \
    --disabled-password \
    --gecos "" \
    --home /app \
    app
USER app

WORKDIR /app
COPY ./app/ /app/


0 commentaires

1
votes

J'ai rencontré le même problème sur Mac. Les seuls changements que j'ai faits ont été de modifier la configuration des volumes dans les volumes docker-compose.yml

: - ./app / app ci-dessous les volumes

: - ./app:/app

Cela a fonctionné pour moi. Le simple fichier docker-compose.yml ressemble à ci-dessous

version : "3"

services:
 app:
    build:
      context: .
    ports:
         - "8000:8000"
    volumes:
         - ./app:/app
    command: >
          sh -c "python manage.py runserver 0.0.0.0:8000"


0 commentaires