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?

31
demandé sur Dolan Antenucci 2015-08-15 08:53:57

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 --reload flag va recharger automatiquement le gunicorn après tout scp / rsync.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., docker-compose build web && docker-compose up -d). Cela peut être plus lent que l'approche rsync si votre dossier src est grand.

25
répondu Dolan Antenucci 2017-02-19 21:30:54

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!

17
répondu Paul Becotte 2015-08-15 20:42:20