Vue项目通过Docker部署后页面空白,Dockerfile哪里出问题?
用Vue写了个简单页面,Dockerfile构建后运行容器一直显示空白。本地npm run serve没问题,但docker run后只有白屏。
代码是这样的:
<template>
<div id="app">
<h1>{{ greeting }}</h1>
<p>Version: {{ version }}</p>
</div>
</template>
<script>
export default {
data() {
return {
greeting: "欢迎使用",
version: process.env.VUE_APP_VERSION
};
}
};
</script>
我的Dockerfile写了:COPY . /usr/src/app然后用nginx运行,但访问时控制台报404找不到/app.js。尝试过在CMD加npm run build但容器启动就退出了,docker logs没错误提示…
首先你得明白,Vue项目在开发环境和生产环境的运行方式是完全不同的。
开发的时候你用
npm run serve是启动了一个本地的开发服务器(基于 webpack-dev-server),它会动态打包、热更新,还能处理各种路由,所以本地能跑。但你用 Docker 部署的时候,如果只是把源码直接 COPY 进去然后用 nginx 启动,那 nginx 里没有任何东西可以处理 Vue 的前端路由,更别提打包后的静态资源路径对不对了。
你提到控制台报 404 找不到
/app.js,说明你访问的页面里引用了这个 JS 文件,但 nginx 里根本没这个文件——因为你还 没打包!你试过在 CMD 里加
npm run build但容器启动就退出,这是因为npm run build执行完就结束了,没有前台进程,nginx 根本没启动起来,容器自然就退出了。正确的做法应该是分两步走:
第一步:构建阶段
用一个 Node 环境的镜像把项目打包成静态文件(也就是
dist目录)第二步:运行阶段
用 nginx 把
dist里的静态文件服务出来我给你写一个完整能跑的
Dockerfile,你照着改就行:你可能没写
nginx.conf,这里也给你一个最常用的配置,要和上面的 Dockerfile 放在同一个目录下:这里有几个地方你得特别注意:
1. 你原来的
COPY . /usr/src/app是把源码复制进去了,但没打包,nginx 只会当它是普通文件,根本不会处理 Vue 的入口逻辑2.
npm run build必须在 Docker 里执行,而且要确保dist目录生成成功(可以本地先跑一遍npm run build看看有没有报错)3. nginx 的配置里
try_files这一行非常关键,Vue 默认用的是 history 模式,如果不加这个,刷新页面或者直接访问路由地址会 404另外你代码里用了
process.env.VUE_APP_VERSION,这个变量是通过.env文件注入的,你得确认你的项目根目录有类似这样的文件:否则打包时会是
undefined,虽然不会导致白屏,但页面内容可能不对。最后你构建的时候建议加个
.dockerignore,把node_modules、dist等排除掉,避免污染构建上下文:构建命令你照着这样来:
docker build -t my-vue-app .运行:
docker run -p 8080:80 my-vue-app然后浏览器访问
http://localhost:8080就能看到页面了。我当年第一次也卡在这儿,以为是环境变量或者 nginx 权限问题,折腾半天才发现是漏了
try_files和没打包……你按这个来,应该就能跑起来了。这样就完事了,别折腾那些乱七八糟的命令了。