Docker 部署 Quasar 前端项目

一般来说,前端项目其实谈不上部署,因为都是静态文件,就算服务器打包,也只是登录过去拉取代码打个包而已,并且公司里基本用 jenkins,运维配置好之后也很方便。

但是,如果没有 jenkins,项目不仅需要打包,还需要启动 ssr 服务,甚至还有配套的后端服务,如果每次都登录后台操作就太麻烦了。所以,我不得不折腾了 docker 部署。

首先,说明一下项目基本架构和需要的打包步骤。

我的项目分为 server 和 web,这两个都在一个 repo 里,方便管理。docker 里要做的事情是:全局安装 yarn、quasar、pm2,进入 server,安装依赖,启动服务。然后进入 web,安装依赖,打包 ssr,安装 ssr 依赖,启动 ssr 服务。

配置

首先,需要有一个 docker-compose.yml 文件。

version: "2.1"
services:
  node:
    image: "node:18"
    user: "root"
    ports:
      - 9100:9100
    working_dir: /home/node/app
    environment:
      - NODE_ENV=production
      - TZ=Asia/Shanghai
    volumes:
      - ./:/home/node/app
    privileged: true
    command: sh ./start.sh

然后是一个 start.sh 脚本:

pwd && ls && git pull && npm install pm2 @quasar/cli yarn -g --force && cd ./server && yarn && pm2 start && cd ../web && yarn --production=false && pwd && ls && yarn build:ssr && cd ./dist/ssr && yarn --production=false && pm2 start && pm2 log

这里有几个地方需要注意(踩了不少坑):

无权限:npm ERR! Error: EACCES: permission denied

启动 docker 后立即就停止了,日志报没有权限——npm ERR! Error: EACCES: permission denied, mkdir ‘/home/node/app/web/node_modules’。

因为一开始的 docker-compose 配置没有 privileged 和 root 用户权限。后来尝试配置 privileged 为 true,但是依然没有权限,搜了很多资料,后来尝试把初始的 user: “node” 改成了 user: “root”,这才解决了无权限问题。

虽然 docker 不建议使用 root 权限,但是……问题得解决啊。

quasar 打包不识别 build 命令

Global Quasar CLI • ⚠️ Error Unknown command “build”

这个报错就很迷惑,你自己的命令怎么能够不识别呢?

于是又是到处找资料,好在找到了。大概是说,yarn 安装的时候,如果 node 环境变量设为 production,那么 devDependencies 就不会安装。我……………………

于是,start.sh 脚本的两个安装依赖的命令就多了 –production=false 的配置。

npm 找不到 && 包

一开始的安装命令是这样的:npm install && pm2 start。

npm 理所当然的把 && 视为了一个包,但很显然没有这个包。于是,我尝试了分行:

npm install
pm2 start

如果所有的命令都不出错的话,这没问题。但是,如果其中一个错了,后续的还会接着执行。这很显然不符合需求,我希望一个错了,后面的不执行。所以还是只能用 && 符号。思来想去,我决定换成 yarn 试一下,于是一开始安装全局包的地方多了 yarn。而 yarn 也确实不负所托。

其实,把命令用括号围起来应该也是可以的。比如这样:(npm install) && (pm2 start)。

文件已存在

在全局安装包的时候,如果包已经存在就会报错。为此,全局安装加了 –force 参数。虽然这会导致包重新安装,增加脚本运行时间,但是,先这样吧,好得能跑起来。

碰到的问题看上去不多,但实际上折腾了很久,还有些问题忘了。

开发这条路,真的一步一坎,很多时候,真的想放弃。但又不想这么早去送外卖,所以,还是接着写代码吧。