Golang+Vue项目Docker化

Golang+Vue项目Docker化

最近做了一个轻全栈项目,用Golang编写服务端API接口,用Vue2.6实现前端UI。最后使用Docker进行构建部署。

整个开发过程还是很顺畅的,没有遇到太大的麻烦。当最后用Docker构建完跑起来的时候,真的发现Docker这玩意是真的方便啊!

话不多说,直接介绍这个小项目的整体思路。

项目结构

这是一个前后端分离,但是代码放一块的项目。

|-- src/
|-- www/
|-- main.go
|-- go.mod

项目结构大概就这样,src放Golang源码,www放前端项目。

实时开发

开发体验对我们来说十分的重要,前端项目我们有vue-cli提供的热更新。Golang我们则使用air来进行文件监听和重启。
同时配置.air.toml来忽略前端文件的变更。

Dockerfile

当开发工作完毕后,我们需要将项目打包部署到线上环境。当然我们可以直接把项目clone到线上服务器,然后再构建Golang环境,Nodejs环境,然后构建Golang程序,构建前端项目…

如果只有一个环境,那工作量还说得过去。如果不止一个…

所以我们考虑使用Docker来帮助我们构建项目。那首先肯定是写一个Dockerfile

基础镜像

在DockerHub上找到了Golang的基础镜像golang:1.15。具体版本得看你的项目。

FROM golang:1.15

Nodejs和npm

基础镜像只安装了Golang环境,我们的前端项目所需要的nodejsnpm基础镜像并没有提供。需要我们自己安装。

DockerHub上的简介显示golang:1.15镜像是基于Debian-buster的。我们根据Nodejs安装指南找到如下命令:

curl -sL https://deb.nodesource.com/setup_15.x | bash - apt-get install -y nodejs

构建Golang程序

直接用官方镜像推荐的方法。

WORKDIR /go/src/app COPY . . RUN go get -d -v ./... RUN go build -o /usr/local/bin

构建前端项目

WORKDIR /go/src/app/www RUN npm install RUN npm run build # 我们的Go程序中指定的静态资源目录 RUN mv ./dist/* /var/www/html

最后

ENTRYPOINT [ "/usr/local/bin/easy-etcd" ]

go build之后生成的可执行文件,可执行文件的名称来自于编译时的包名。这里的easy-etcd是我的Golang项目的包名。

构建与部署

最后就是基础的镜像构建和运行了。

构建

docker build -t easy-etcd:1.0 .

运行

docker run -itd -p 9000:9000 easy-etcd:1.0

一键搞定。但是网络差的情况下安装两个项目的依赖,你懂的。

附上完整Dockerfile

# Debian 10 FROM golang:1.15 RUN mkdir -p /var/www/html # 安装nodejs RUN apt-get -yqq update RUN curl -sL https://deb.nodesource.com/setup_15.x | bash - RUN apt-get install -y nodejs # 构建go程序 WORKDIR /go/src/app COPY . . RUN go get -d -v ./... RUN go build -o /usr/local/bin # 构建静态UI文件 WORKDIR /go/src/app/www RUN npm install RUN npm run build # Go程序中指定的静态资源目录 RUN mv ./dist/* /var/www/html ENTRYPOINT [ "/usr/local/bin/easy-etcd" ]

后续优化

debian构建出来的镜像实在有点大。之后我有采用了alpine版的基础镜像golang:1.15-alpine。而且安装nodejs直接用apk命令就可以。

然后再加上golangnpm的中国代理。最后的终极Dockerfile如下

# Debian 10 FROM golang:1.15-alpine RUN mkdir -p /var/www/html # 安装nodejs RUN apk add --update nodejs npm # 淘宝镜像 RUN npm install -g cnpm --registry=https://registry.npm.taobao.org # 构建go程序 WORKDIR /go/src/app COPY . . RUN go env -w GOPROXY=https://goproxy.cn,direct RUN go get -d -v ./... RUN go build -o /usr/local/bin # 构建静态UI文件 WORKDIR /go/src/app/www RUN cnpm install RUN npm run build # Go程序中指定的静态资源目录 RUN mv ./dist/* /var/www/html ENTRYPOINT [ "/usr/local/bin/easy-etcd" ]

依赖包安装速度直线上升!!!体积也小了不少。

上一篇 GO踩坑集锦
下一篇 Vue3有哪些不向下兼容的改变