Rechargement automatique des modifications de code avec le développement Django dans Docker avec Gunicorn
J'utilise un conteneur Docker pour le développement de Django, et le conteneur fonctionne avec du Gunicorn avec du Nginx. J'aimerais que le code change en auto-load, mais la seule façon de les charger est de reconstruire avec docker-composer (docker-compose build
). Le problème avec "build" est qu'il ré-exécute toutes mes installations pip.
j'utilise le Gunicorn --reload
flag, qui est apparemment censé faire ce que je veux. Voici mes fichiers de configuration Docker:
## Dockerfile:
FROM python:3.4.3
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install -r /code/requirements/docker.txt
## docker-compose.yml:
web:
restart: always
build: .
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app/static
env_file: .env
command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload
nginx:
restart: always
build: ./config/nginx
ports:
- "80:80"
volumes:
- /www/static
volumes_from:
- web
links:
- web:web
postgres:
restart: always
image: postgres:latest
volumes:
- /var/lib/postgresql
ports:
- "5432:5432"
j'ai essayé l'autre Docker commandes (docker-compose restart
,docker-compose up
), mais le code ne se rafraîchit pas.
Ce qui me manque?
2 réponses
grâce à kikicarbonell, j'ai cherché à avoir un volume pour mon code, et après avoir regardé le Docker Compose recommandé Django setup, j'ai ajouté volumes: - .:/code
à mon conteneur web dans docker-composer.yml, et maintenant tous les changements de code que je fais s'appliquent automatiquement.
## docker-compose.yml:
web:
restart: always
build: .
expose:
- "8000"
links:
- postgres:postgres
volumes:
- /usr/src/app/static
- .:/code
env_file: .env
command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload
mise à Jour: pour un exemple complet de L'utilisation de Gunicorn et Django avec Docker, vérifiez ceci exemple de projet à partir de Rackspace, qui montre aussi comment utiliser docker-machine pour lancez la configuration sur des serveurs distants comme Rackspace Cloud.
Avertissement: actuellement, cette méthode ne fonctionne pas lorsque votre code est local et que l'hôte du docker est distant (par exemple, sur un fournisseur cloud comme Digital Ocean ou Rackspace). Cela s'applique également aux machines virtuelles si votre système de fichiers local n'est pas monté sur la VM. Notez qu'il y a des pilotes de volume séparés (par exemple, flocker), et là y avoir quelque chose pour répondre à ce besoin. Pour maintenant, la "solution" est de rsync/scp vos fichiers jusqu'à un répertoire sur la télécommande panneau d'accueil. Ensuite, le mise à Jour: si vous appuyez sur le code pour supprimer l'hôte docker, je trouve qu'il est beaucoup plus facile de simplement reconstruire le conteneur docker (e.g., --reload
flag va recharger automatiquement le gunicorn après tout scp / rsync.docker-compose build web && docker-compose up -d
). Cela peut être plus lent que l'approche rsync si votre dossier src est grand.
vous avez un autre problème-Docker cache chaque couche qu'il construit. Vous ne devriez pas avoir à relancer pip install à chaque fois!
ADD . /code/
RUN pip install -r /code/requirements/docker.txt
Ceci est votre problème-Docker vérifie chaque déclaration ADD pour voir si des fichiers ont changé et invalide le cache pour cela et chaque étape ultérieure si elle l'a fait. La bonne façon de le faire est...
ADD ./requirements/docker.txt /code/requirements/
RUN pip install -r /code/requirements/docker.txt
ADD ./code/
qui n'invalidera votre ligne d'installation pip que si votre fichier d'exigences change!