Tengo un Dockerfile muy básico que instala Vue CLI y expone el puerto 8080 :
FROM node RUN yarn global add @vue/cli EXPOSE 8080 Tengo un docker-compose.yml que conecta el puerto del host al expuesto en el contenedor:
version: '3' services: vue: build: context: . dockerfile: ./Dockerfile volumes: - .:/home/node working_dir: '/home/node' ports: - '8080:8080' Ejecuto un contenedor con docker-compose run vue bash y luego creo un proyecto Vue con vue create foo .
Dentro de la carpeta del proyecto, agregué un vue.config.js :
module.exports = { devServer: { host: '0.0.0.0', port: 8080 } } Cuando ejecuto el servidor de desarrollo con yarn serve , veo:
App running at: - Local: http://localhost:8080/ It seems you are running Vue CLI inside a container. Access the dev server via http://localhost:<your container's external mapped port>/ Si bien muestra que está alojado localmente en localhost y no en 0.0.0.0 , parece ser un error de visualización conocido .
Sin embargo, no puedo comunicarme con Vue a través de http://localhost:8080 desde la máquina host.
He mirado varios tutoriales para configurar esto y no puedo entender por qué no puedo acceder al servidor de desarrollo de Vue.
No me di cuenta de que docker-compose run no configura los puertos definidos en docker-compose.yml de forma predeterminada. Esto puede ser forzado por docker-compose run --service-ports .
Me decidí por una solución en la que separé la ejecución de los comandos vue cli y la ejecución del servidor de desarrollo en servicios separados:
version: '3' services: vue-cli: build: context: . dockerfile: ./Dockerfile image: auscert/vue:latest volumes: - .:/home/node working_dir: '/home/node/demo' command: ['echo', 'Service vue-cli is run only'] vue: image: auscert/vue:latest ports: - '8080:8080' volumes: - .:/home/node working_dir: '/home/node/demo' command: ['yarn', 'serve'] Esto me permite seguir usando docker-compose run vue-cli para aplicaciones únicas y para obtener fácilmente un shell, mientras que todo el servicio de contenido lo realiza un servicio dedicado. (Agregar un echo como command para el servicio vue-cli asegura que se recupera inmediatamente en un docker-compose up ).
Use docker-compose up en lugar de docker-compose run que, de forma predeterminada, no expone los puertos (como ha notado)
¿Cuál es la diferencia entre
up,runystart?Por lo general, desea docker-compose up. Use up para iniciar o reiniciar todos los servicios definidos en un docker-compose.yml. En el modo "adjunto" predeterminado, verá todos los registros de todos los contenedores. En el modo "separado" (-d), Compose sale después de iniciar los contenedores, pero los contenedores continúan ejecutándose en segundo plano.
El comando de ejecución docker-compose es para ejecutar tareas "únicas" o "ad hoc". Requiere el nombre del servicio que desea ejecutar y solo inicia contenedores para los servicios de los que depende el servicio en ejecución. Use ejecutar para ejecutar pruebas o realizar una tarea administrativa, como eliminar o agregar datos a un contenedor de volumen de datos. El comando de ejecución actúa como docker run -ti en el sentido de que abre una terminal interactiva para el contenedor y devuelve un estado de salida que coincide con el estado de salida del proceso en el contenedor.
El comando docker-compose start solo es útil para reiniciar contenedores que se crearon previamente, pero que se detuvieron. Nunca crea nuevos contenedores.