用 Go 语言开发的程序打包后就一个可执行的二进制文件,一般情况下是不需要什么环境依赖就能执行运行跑起来,如果拿到 Docker 里面跑,是非常有优势的。
现在都 2021 年了,啥都喜欢搞微服务、分布式概念,今天咱们迈出第一步,先把自己的 Go 程序打包成镜像后期再更怎么上传到阿里云的私有仓库里面。
这里我们将会使用到分阶段构建镜像,来减小我们最后输出的镜像大小。
这里我就快速用 Gin 写一个服务:
这里我们会用到 go mod,使用它来安装 Gin 依赖,命令如下:
go get github.com/gin-gonic/gin
然后就是写服务代码了:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.New()
r.Handle("GET","/", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"code": 200})
})
r.Run(":80")
}
跑起来大概是这样的,这里我们就不去处理异常等细节的:
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
如果你对这块不了的话,可以给我留言,人多了,我们可以考虑出一个 Dockerfile 的系列教程。
为了使我们最后构建出来的镜像尽量的小,我们最好是分阶段构建。
第一个阶段我们在 go 环境下,编译出我们的可执行二进制文件。
构建配置如下:
FROM golang:1.17-alpine3.13 as builder
RUN mkdir /src
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 安装依赖库 GCC 这些,根据实际情况考虑是否安装
RUN apk add build-base
ADD . /src
WORKDIR /src
RUN go env -w GOPROXY=https://goproxy.cn,direct && go mod tidy
RUN GOPROXY=https://goproxy.cn go build -o app main.go && chmod +x app
关键点解释:
其他的应该都不难理解,有问题欢迎留言。
第一阶段构建完毕,我们就能得到一个可执行的二进制文件 app 了。
此时我们就需要进入第二阶段构建,真正的构建出生产用的镜像,直接上代码:
FROM alpine:3.12
ENV ZONEINFO=/app/zoneinfo.zip
RUN mkdir /app
WORKDIR /app
COPY --from=builder /usr/local/go/lib/time/zoneinfo.zip /app
COPY --from=builder /src/app /app
ENTRYPOINT ["./app"]
EXPOSE 80
关键点解释:
注意这两个 COPY 都是 --from=builder ,这里的 builder 和第一阶段的 as builder 是一一对应的。
最后把以上两个阶段的构建代码都复制到 Dockerfile 里面就结束了。
配置文件好了,剩下就是构建镜像了,直接基于 Dockerfile 文件用 docker 打包即可!
所以需要在安装好 docker 环境的机器上才能构建 docker 镜像。
命令如下:
docker build -t gin-deom:v1 .
这里的 gin-deom:v1 就是你的镜像名字了,我这里是随便写的,实际生产中肯定是域名 + 镜像名字 + 版本号这样的格式。
当你看到如下所示的 Successfully 就表示打包成功了:
此时你看下本地的镜像里面就会多出一个名为 gin-deom:v1 的镜像。
到这里这篇文章的使命就完成了,下一篇我们考虑把他上传私有镜像仓库!