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?
3 Réponses :
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.
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/
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"
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 leDockerfile
. Votre conteneur fonctionne-t-il si vous supprimez lesvolumes:
?@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) puissudo usermod -aG docker $ USER
. Et se déconnecter et se reconnecter.