听说你还不会分阶段构建 Docker 镜像?

用 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 ?

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

关键点解释:

  • From 基于那个基础镜像,这里我们基于 go 的 1.17 版本构建,这里最好和你本地开发环境的 go 版本保持一致。

  • RUN go env 这一行是设置 go mod 的代理,以及根据 go.mod 文件安装依赖

其他的应该都不难理解,有问题欢迎留言。

第二阶段构建

第一阶段构建完毕,我们就能得到一个可执行的二进制文件 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 是复制第一阶段里面的时区,可以根据实际情况选择是否复制。

  • 第二个 COPY 是把 app 二进制文件复制到这个镜像里面。

注意这两个 COPY 都是 --from=builder ,这里的 builder 和第一阶段的 as builder 是一一对应的。

最后把以上两个阶段的构建代码都复制到 Dockerfile 里面就结束了。

打包镜像

配置文件好了,剩下就是构建镜像了,直接基于 Dockerfile 文件用 docker 打包即可!

所以需要在安装好 docker 环境的机器上才能构建 docker 镜像

命令如下:

docker build -t gin-deom:v1 .

这里的 gin-deom:v1 就是你的镜像名字了,我这里是随便写的,实际生产中肯定是域名 + 镜像名字 + 版本号这样的格式。

当你看到如下所示的 Successfully 就表示打包成功了:

此时你看下本地的镜像里面就会多出一个名为 gin-deom:v1 的镜像。

到这里这篇文章的使命就完成了

全部评论

相关推荐

来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务