run postgres postgre manage and django docker gunicorn docker-compose

postgres - docker django postgre



Recarga automática de cambios de código con el desarrollo de Django en Docker con Gunicorn (2)

Estoy usando un contenedor Docker para el desarrollo de Django, y el contenedor ejecuta Gunicorn con Nginx. Me gustaría que los cambios de código se carguen automáticamente, pero la única forma en que puedo hacer que carguen es reconstruyendo con docker-compose ( docker-compose build ). El problema con "compilar" es que vuelve a ejecutar todas mis instalaciones de pip.

Estoy usando la bandera de Gunicorn --reload , que aparentemente hace lo que quiero. Aquí están mis archivos de configuración de 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"

He intentado algunos de los otros comandos de Docker ( docker-compose restart , docker-compose up ), pero el código no se actualizará.

¿Qué me estoy perdiendo?


Gracias a kikicarbonell, busqué un volumen para mi código, y después de ver la configuración de Django recomendada por Docker Compose , agregué volumes: - .:/code a mi contenedor web en docker-compose.yml, y ahora cualquier código cambia Hago solicitud automática

## 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

Actualización: para obtener un ejemplo completo del uso de Gunicorn y Django con Docker, revise este proyecto de ejemplo de Rackspace , que también muestra cómo usar docker-machine para iniciar la instalación en servidores remotos como Rackspace Cloud.

Advertencia: actualmente, este método no funciona cuando el código es local y el host Docker es remoto (por ejemplo, en un proveedor de la nube como Digital Ocean o Rackspace). Esto también se aplica a máquinas virtuales si su sistema de archivos local no está montado en la máquina virtual. Tenga en cuenta que hay controladores de volumen separados (por ejemplo, Flocker), y que podría haber algo para solucionar esta necesidad. Por ahora, la "solución" es sincronizar / copiar sus archivos en un directorio en el host del acoplador remoto. Luego, la bandera --reload se recargará automáticamente después de cualquier scp / rsync. Actualización: si presiono el código para eliminar el host de Docker, me resulta mucho más fácil simplemente reconstruir el contenedor de Docker (por ejemplo, docker-compose build web && docker-compose up -d ). Esto puede ser más lento que el enfoque rsync si su carpeta src es grande.


Usted tiene otro problema: Docker almacena en caché cada capa que construye. ¡No debería tener que volver a ejecutar la instalación de pip cada vez!

ADD . /code/ RUN pip install -r /code/requirements/docker.txt

Este es su problema: Docker verifica cada declaración ADD para ver si los archivos han cambiado e invalida la memoria caché para ello y cada paso posterior si lo ha hecho. La forma correcta de hacerlo es ...

ADD ./requirements/docker.txt /code/requirements/ RUN pip install -r /code/requirements/docker.txt ADD ./code/

¡Lo cual solo invalidará su línea de instalación de pip si cambia su archivo de requisitos!