Saltar al contenido

¿Por qué mi volumen docker-compose no se actualiza con las adiciones de archivos locales?

Esta es la contestación más válida que te podemos dar, pero primero mírala pausadamente y valora si se adapta a tu trabajo.

Solución:

No puedo ver un problema con lo que tienes aquí. copié tu docker-compose.yml y eliminó sólo el entrypoint: parte de eso y funcionó para mí.

docker-compose.yml

version: '3'
services:
  webapp:
    build:
      context: .
      dockerfile: ./web/Dockerfile
    volumes:
      - ./web/:/usr/src/app/
      - staticfile_volume:/usr/src/app/public
  nginx:
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    depends_on:
      - webapp
    volumes:
      - staticfile_volume:/usr/src/app/public
volumes:
  staticfile_volume:

web/Dockerfile

FROM ubuntu:18.04

CMD tail -f /dev/null

nginx/Dockerfile

FROM nginx:latest

CMD tail -f /dev/null

Manifestación:

Docker-volúmenes

Para profundizar en el comentario anterior de DannyB, asegúrese de no estar creando el archivo en el anfitrión en web/public ya que esta carpeta se monta cuando se inician los contenedores. Un volumen docker funciona de manera similar a un montaje estándar de Linux: docker simplemente montará el nuevo volumen sobre la parte superior del directorio existente.

Si desea ejecutar un comando dentro de un contenedor Docker que cambia los archivos en su sistema de archivos host, no use un volumen docker; en su lugar, use un montaje de enlace como lo ha hecho aquí: - ./web/:/usr/src/app/.

La diferencia entre un enlace de montaje y un volumen de la ventana acoplable es que un montaje de enlace montará archivos desde su host dentro de su contenedor, y dependerá de que esas carpetas/archivos estén en su sistema de archivos host, y un volumen docker será completamente administrado por docker y solo se puede compartir entre contenedores, no con el host también (aunque estos archivos viven en algún lugar del host, no es práctico rastrearlos e intentar usarlos).

De hecho, puede simplemente eliminar su volumen de la ventana acoplable de tu docker-compose y agregue un montaje de enlace para nginx y comenzará a ver el comportamiento que está buscando:

docker-compose.yml

version: '3'
services:
  webapp:
    build:
      context: .
      dockerfile: ./web/Dockerfile
    volumes:
      - ./web/:/usr/src/app/
  nginx:
    build:
      context: .
      dockerfile: ./nginx/Dockerfile
    depends_on:
      - webapp
    volumes:
      - ./web/public:/usr/src/app/public

Manifestación:

ingrese la descripción de la imagen aquí

Le has dicho a Docker que staticfile_volume contiene datos críticos de la aplicación que deben conservarse en todas las ejecuciones del contenedor. La primera vez que se inicia el contenedor, y solo la primera vez, Docker lo completará a partir de la imagen. Si actualiza la imagen más tarde, dado que el volumen contiene datos críticos de la aplicación, Docker no la cambiará.

La solución a corto plazo más fácil es eliminar el volumen. Tratar docker-compose down -v; docker-compose up --build. Tendrá que hacer esto cada vez que cambie el static contenido.

Sería un poco más fácil a largo plazo configurar la aplicación de back-end para servir sus propios archivos. Django tiene un django.contrib.staticfiles módulo para hacer esto. Luego, su proxy nginx puede redirigir incondicionalmente al contenedor back-end, y no tiene que preocuparse por el problema de compartir archivos.

(Para ver esto mejor, tome la receta de reproducción de @ChrisMcKinnel y ejecútela una vez. Luego tome la web/Dockerfile de ahí y COPY un archivo en /usr/src/app/public y volver a ejecutar docker-compose up --build. No verá aparecer el archivo a menos que docker-compose down -v.)

Reseñas y puntuaciones de la guía

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *