我有一个非常基本的Dockerfile
,它安装了Vue CLI
并公开了端口8080
:
FROM node
RUN yarn global add @vue/cli
EXPOSE 8080
我有一个docker-compose.yml
,用于将主机端口连接到容器上的裸露端口:
version: '3'
services:
vue:
build:
context: .
dockerfile: ./Dockerfile
volumes:
- .:/home/node
working_dir: '/home/node'
ports:
- '8080:8080'
我使用docker-compose run vue bash
运行一个容器,然后使用vue create foo
创建一个Vue项目。
在项目文件夹中,我添加了一个vue.config.js
:
module.exports = {
devServer: {
host: '0.0.0.0',
port: 8080
}
}
当我使用yarn serve
运行开发服务器时,我看到:
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>/
虽然表明它是在localhost
而不是0.0.0.0
本地托管的,但这似乎是a known display bug。
但是,我无法从主机通过http://localhost:8080
到达Vue。
我查看了多个教程进行设置,但无法弄清为什么我无法访问Vue开发服务器。
答案 0 :(得分:1)
我没有意识到docker-compose run
并没有默认设置docker-compose.yml
中定义的端口。可以通过docker-compose run --service-ports
强制执行。
我已经确定了一个解决方案,其中我将运行vue cli命令和将开发服务器运行到单独的服务中分开了:
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']
这使我仍然可以一次使用docker-compose run vue-cli
并轻松获得外壳,而所有内容的提供均由专用服务完成。 (为echo
服务添加command
作为vue-cli
可以确保它立即在docker-compose up
上摆脱困境。)
答案 1 :(得分:0)
使用docker-compose up
代替docker-compose run
,默认情况下,up
不会暴露端口(如您所注意到的那样)
run
,start
和{{1}}有什么区别?通常,您需要docker-compose起来。用完启动或重新启动docker-compose.yml中定义的所有服务。在默认的“附加”模式下,您会看到来自所有容器的所有日志。在“分离”模式(-d)中,启动容器后Compose退出,但是容器继续在后台运行。
docker-compose run命令用于运行“一次性”或“临时”任务。它需要您要运行的服务名称,并且仅启动正在运行的服务所依赖的服务的容器。使用运行来运行测试或执行管理任务,例如将数据删除或添加到数据卷容器。 run命令的行为类似于docker run -ti,它打开了容器的交互式终端,并返回与容器中进程的退出状态匹配的退出状态。
docker-compose start命令仅对重新启动先前创建但已停止的容器有用。它永远不会创建新的容器。