Usando Ubuntu Linux con docker instalado. No VM.
He creado una imagen acoplable con una aplicación vuejs. Para habilitar la recarga en caliente, inicio el contenedor acoplable con:
docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image
Se inicia bien y puedo acceder desde mi navegador host localhost:8081
. Pero cuando hago cambios en los archivos de origen y guardo esos cambios, no se reflejan en mi navegador antes de presionar F5 (la recarga en caliente no funciona).
Algunos detalles a continuación:
package.json
"scripts": {
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
build / webpack.dev.conf.js
devServer: {
clientLogLevel: 'warning',
...
hot: true,
...
watchOptions: {
//poll: config.dev.poll,
//aggregateTimeout: 500, // delay before reloading
poll: 100 // enable polling since fsevents are not supported in docker
}
Intenté modificar las opciones de watch pero no tiene ningún efecto.
EDITAR:
Según la respuesta a continuación, he intentado pasar: CHOKIDAR_USEPOLLING=true
como una variable de entorno para ejecutar Docker
docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -e "CHOKIDAR_USEPOLLING=true" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image
Pero no tiene efecto, todavía no puedo recargar mis cambios en caliente. También en el enlace provisto dice:
Actualización / Aclaración: este problema solo ocurre cuando se ejecuta el motor Docker dentro de una VM. Si está en Linux tanto para Docker como para la codificación, no tiene este problema.
Así que no piense que la respuesta se aplica a mi configuración: estoy ejecutando Ubuntu Linux en mi máquina donde instalé docker. Entonces no hay configuración de VM.
Otra actualización , basada en el comentario a continuación sobre cómo cambiar la asignación de puertos:
# Hot reload works!
docker run -it -p 8080:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image
# Hot reload fails!
#docker run -it -p 8081:8080 -e "HOST=0.0.0.0" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image
Entonces, si porto el mapa a en 8080:8080
lugar de 8081:8080
la recarga en caliente funciona Observe que la aplicación aparece en ambos casos cuando accedo a ella en mi navegador host localhost
en los puertos mencionados anteriormente. Es solo que la recarga en caliente solo funciona cuando asigno la aplicación a 8080 en mi host.
¿¿Pero por qué??
Ahora si lo hago:
PORT='8081'
docker run -it -p "${PORT}:${PORT}" -e "HOST=0.0.0.0" -e "PORT=${PORT}" -v ${PWD}:/app/ -v /app/node_modules --name my-frontend my-frontend-image
Recarga en caliente, por supuesto, funciona. Pero aún no estoy seguro de por qué no puedo asignar el puerto de contenedor interno 8080 a 8081 externamente en el host.
Por cierto; No veo el problema en absoluto si lo uso vue-cli-service serve
, todo funciona de forma inmediata .
-p 8080:8080 -p 8081:8081