2017-10-03 5 views
0

Je suis nouveau sur Docker, AWS Lambda et Zappa, mais j'essaye de configurer un projet avec très peu de succès.Déploiement avec zappa, projet Django dans le sous-dossier

Je me connecte à Docker (docker-compose run web bash), active l'environnement, configure les informations d'identification AWS et exécute zappa init et zappa deploy. Cependant, après le déploiement, je reçois une erreur (exécution zappa tail):

ModuleNotFoundError: No module named 'project' 

Je crois que c'est parce que ma structure dir n'est pas la norme:

Dockerfile 
zappa_settings.json 
requirements.txt 
project\ 
- manage.py 
- root\ 
    - settings.py 
    - wsgi.py 
    - ... 

Alors, mon projet django se trouve dans le dossier project , car je n'aime pas avoir tous les fichiers jetés là et mélangés avec d'autres fichiers de configuration.

Mon fichier de configuration zappa ressemble à ceci:

{ 
    "dev": { 
     "aws_region": "us-east-2", 
     "django_settings": "project.root.settings", 
     "profile_name": "default", 
     "project_name": "task", 
     "runtime": "python3.6", 
     "s3_bucket": "bucket-name" 
    } 
} 

Et Dockerfile:

FROM lambci/lambda:build-python3.6 

# Copy in your requirements file 
ADD requirements.txt /requirements.txt 

# Copy your application code to the container 
RUN mkdir /code/ 
WORKDIR /code/ 
ADD . /code/ 

ENV PS1 '[email protected]$(pwd | sed "[email protected]^/var/task/\[email protected]@")\$ ' 

ADD zappa_settings.json /var/task/zappa_settings.json 

WORKDIR /var/task 

RUN virtualenv /var/venv && \ 
    source /var/venv/bin/activate && \ 
    pip install -U pip zappa && \ 
    pip install -r /requirements.txt && \ 
    deactivate 

CMD ["zappa"] 

Pouvez-vous me dire comment configurer correctement? Merci!

MISE À JOUR:

dernière erreur après avoir déménagé à sous-dossier:

ModuleNotFoundError: No module named root

+1

Que diriez-vous vous déplacer en Dockerfile', 'zappa_settings.json',' fichiers requirements.txt' à même emplacement avec fichier 'manage.py' et changer zappa config' "django_settings ":" root.settings "'? – Beomi

+0

Merci @Beomi. Logique. Cependant, je l'ai fait et maintenant je reçois 'ModuleNotFoundError: Aucun module nommé 'root''. J'ajoute un screeshot de l'erreur complète. Merci –

Répondre

1

Vous pouvez garder votre structure de fichiers avec zappa et il fonctionnera parfaitement.

Compte tenu de la structure du fichier

Dockerfile 
zappa_settings.json 
requirements.txt 
project\ 
- manage.py 
- root\ 
    - settings.py 
    - wsgi.py 
    - ... 

Vous pouvez simplifier votre Dockerfile pour être

FROM lambci/lambda:build-python3.6 

ADD . /var/task 

RUN python -m venv /var/task/dockervenv && \ 
    source /var/task/dockervenv/bin/activate && \ 
    pip install -U pip zappa && \ 
    pip install -r /var/task/requirements.txt && \ 
    deactivate 

WORKDIR /var/task 

ENV PS1 '[email protected]$(pwd | sed "[email protected]^/var/task/\[email protected]@")\$ ' 

CMD ["bash"] 

Et il semble de votre mise à jour que vous avez obtenu des résultats similaires parce que votre application Django semble atteindre le Django code. Vous avez probablement aussi edited your ALLOWED_HOSTS to accept incoming connections

Maintenant, l'erreur ModuleNotFoundError: No module named 'root' est due au fait que votre fichier de paramètres Django ne devrait pas exister dans le sous-répertoire. Vous devez mettre à jour la settings.py de mettre à jour la variable

ROOT_URLCONF = 'project.root.urls' 

Cela devrait vous lever et courir.

Effets secondaires de cette approche docker

En aparté, la façon dont vous configurez votre conteneur docker a des implications sur flux de travail de codage. Votre image docker contiendra une copie de votre code au moment où il a été construit. Ainsi, toutes les modifications sur le code dans un conteneur docker en cours d'exécution seront perdues lorsque le conteneur se terminera à moins d'être exporté d'une manière ou d'une autre (par exemple, git). Bien que cela puisse parfaitement convenir pour un code stable dans un pipeline CI/CD, je ne le recommanderais pas pour le développement actif.

Si vous souhaitez l'utiliser pour le développement actif, lorsque vous appelez docker, faites en sorte que votre projet soit directement mappé en tant que volume lorsque le conteneur est appelé. Par exemple:

docker run -ti -v $(pwd):/var/task --rm <name of your image>

+0

Merci @Edgar. Je crois que je l'ai déjà essayé et l'erreur était "Aucun module nommé" projet ", mais je vais essayer à nouveau. En ce qui concerne la note 'Effet secondaire', que recommanderiez-vous? Je ne travaille pas avec Docker? Parce que je suis sur Windows, je crois que je n'ai pas le choix, mais je suppose que je pourrais juste passer à Linux. –

+0

Diego, essayez-le avec le fichier docker mis à jour que j'ai collé et laissez-moi savoir comment ça se passe. – Edgar