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:
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:
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
.)