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 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, --reload
se recargará automáticamente después de cualquier scp / rsync.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!