Así que tengo un proyecto de Django que estoy implementando con docker-compose. Hay un error simple en mi plantilla profile_form.html con la línea 3 resaltada.
{% include "header.html" %} {% load i18n %} {% load url from future %} 'future' is not a registered tag libraryAsí que simplemente elimino la línea de URL de carga, guardo profile_form.html y luego intento crear un nuevo contenedor que refleje el cambio de código.
docker-compose build docker-compose startEsto no resolvió el problema y recibo el mismo error. Entré en el contenedor corriendo
docker-compose exec -i -t <containerid> /bin/bashy examinó el profile_form.html y, efectivamente, la línea 3 todavía está allí.
A menos que me esté perdiendo algo completamente obvio, esto me dice que mi comprensión de la compilación docker-compose es incorrecta. Como pensé, la compilación docker-compose podría determinar "sí, hay un cambio de código en el directorio 'web'" y luego reconstruir el contenedor.
No necesita reconstruir una imagen acoplable, que se usa para el desarrollo, en cada cambio de su código. Esto tomaría demasiado tiempo. Pero dado que está desarrollando Django y asumo que está utilizando el servidor de desarrollo incluido con Django ( python manage.py runserver ), puede enviar directamente los nuevos cambios de código a su contenedor y dejar que el servidor de desarrollo cargue el código en caliente. como está acostumbrado cuando está desarrollando una aplicación django en su máquina local. Debe asignar un volumen de su host a su contenedor, que recibe el código más reciente y lo usa para actualizar su aplicación.
Como no proporcionó ningún ejemplo de código, solo puedo adivinar lo que está haciendo. Eche un vistazo al ejemplo proporcionado directamente por los desarrolladores de Docker: https://docs.docker.com/compose/django/
Su Dockerfile:
FROM python:2.7 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/ ADD . /code/ inicialmente copia su código local al contenedor. Este es el estado inicial de su aplicación cuando construye la imagen por primera vez. Pero no queremos construir la imagen en cada cambio de código, ya que esto toma algunos minutos. Está utilizando docker-compose y puede asignar volúmenes a su contenedor para recargar el código activo, como se puede ver en el tutorial de los desarrolladores de docker:
version: '2' services: db: image: postgres web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code # <-- THIS line enables hot code reloading! ports: - "8000:8000" depends_on: - db Marqué la línea importante para la recarga de código. Esta línea asegura que cada cambio en su máquina local también se refleje dentro del contenedor. El servidor de ejecución del servidor de runserver reconoce el cambio de código local y reinicia el servidor web, lo que lleva solo unos segundos.
Este es el camino a seguir con una aplicación django dentro de un contenedor docker.
docker-compose start inicia los contenedores antiguos de su imagen anterior con la línea incorrecta en su código. Debe crear nuevos contenedores con la nueva imagen. Para este caso es el comando docker-compose up . De los documentos de docker-compose start :
Uso: iniciar [SERVICIO...]
Inicia contenedores existentes para un servicio.
Sin duda, puede eliminar sus contenedores antiguos con docker-compose rm . Esto elimina solo sus contenedores, no la imagen.