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环境,我们的前端项目所需要的nodejs
和npm
基础镜像并没有提供。需要我们自己安装。
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
命令就可以。
然后再加上golang
和npm
的中国代理。最后的终极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" ]
依赖包安装速度直线上升!!!体积也小了不少。