前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >听说你还不会分阶段构建 Docker 镜像?

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

作者头像
小锟哥哥
发布2022-05-10 08:55:21
3340
发布2022-05-10 08:55:21
举报
文章被收录于专栏:GoLang全栈

用 Go 语言开发的程序打包后就一个可执行的二进制文件,一般情况下是不需要什么环境依赖就能执行运行跑起来,如果拿到 Docker 里面跑,是非常有优势的。

现在都 2021 年了,啥都喜欢搞微服务、分布式概念,今天咱们迈出第一步,先把自己的 Go 程序打包成镜像后期再更怎么上传到阿里云的私有仓库里面。

这里我们将会使用到分阶段构建镜像,来减小我们最后输出的镜像大小。

编写程序

这里我就快速用 Gin 写一个服务:

这里我们会用到 go mod,使用它来安装 Gin 依赖,命令如下:

代码语言:javascript
复制
go get github.com/gin-gonic/gin

然后就是写服务代码了:

代码语言:javascript
复制
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 环境下,编译出我们的可执行二进制文件。

构建配置如下:

代码语言:javascript
复制
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 了。

此时我们就需要进入第二阶段构建,真正的构建出生产用的镜像,直接上代码:

代码语言:javascript
复制
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 镜像

命令如下:

代码语言:javascript
复制
docker build -t gin-deom:v1 .

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

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

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

到这里这篇文章的使命就完成了,下一篇我们考虑把他上传私有镜像仓库!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GoLang全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编写程序
  • 编写 Dockerfile
    • 什么是 Dockerfile ?
      • 第一阶段构建
        • 第二阶段构建
        • 打包镜像
        相关产品与服务
        容器镜像服务
        容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档