线上 Go 项目的 Docker 镜像应该怎么构建?

栏目: IT技术 · 发布时间: 4年前

上期的文章: Kubernetes入门实践--部署运行 Go 项目 发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。

线上 Go 项目的  <a href='https://www.codercto.com/topics/20577.html'>Docker</a>  镜像应该怎么构建?

Go 开发的程序在编译成二进制文件后是可以在没有安装 Go 环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是 Kubernetes 的实践所以镜像方面就没有占太多篇幅。

确实线上项目的应用镜像一般都不像之前文章里讲的那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先用 Docker 容器把项目编译成二进制文件,然后把编译好的文件拷贝到一个新的容器镜像里,新镜像里一般只包含 Linux 系统运行需要的最基本的文件,不需要有 Go 环境,因此能减少很多占用空间。整个这个过程都发生在镜像构建的过程中,这样就能保证多环境的一致性,上面这个构建 Docker 镜像的方式叫做多阶段构建( multi stage build )。

多阶段构建是 17.05 版本才有的功能,所以使用前要先确定下使用的 Docker Engine 的版本。

线上 Go 项目的 Docker 镜像应该怎么构建?

Docker Engine版本

下面就来介绍一下怎么使用 Docker 的多阶段构建制作 Go 应用的镜像。

之前文章 Kubernetes入门实践--部署运行Go项目 里镜像的 Dockerfile 长这样:

FROM golang:1.14-alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main .
CMD ["/app/main"]

我们使用多阶段构建的方式构建镜像后, Dockerfile 会变成类似下面这样:

FROM golang:alpine AS build

RUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp

###
FROM scratch as final
COPY --from=build /app/myapp .
CMD ["/myapp"]

Go 项目应用的 Dockerfile 通常大概类似这样,但是每个项目的细节可能有所不同。 FROM golang:alpine 指定了开始阶段的基础映像(其中包含Go工具和库,用于构建程序), AS build 是给这个阶段取名为 build

golang:alpine 指定了 Go 基础映像的 alpine 版本, alpine 是专门为容器设计的小型 Linux 发行版。这个 Dockerfile 中使用了两次 FROM 指令,第二条 FROM scratch 行,它告诉 Docker 从一个全新的,完全空的容器镜像重新开始,然后将上个阶段编译好的程序复制到其中。这个才是我们随后将用于运行的 Go 应用程序的容器镜像。

scratch 镜像是 Docker 项目预定义的最小的镜像。使用 scratch 镜像可以节省大量空间,因为我们实际上不需要 Go 工具或其他任何东西来运行我们的编译好的程序,这可能也是 Go 在容器时代的一个优势吧。

使用 scratch 镜像制作的 Go 应用镜像在运行时会有一个不识别时区的问题。这个也是我们最近项目往 Kubernetes 上迁移时遇到的第一个问题,不过还好经过 Google 和查看 Go 加载系统时区的源码我帮新来的运维小哥哥找到了解决方法,具体怎么解决的下期的文章再告诉大家。

线上 Go 项目的 Docker 镜像应该怎么构建?

容器和虚拟机到底有啥区别?

Minikube-笔记本上的Kubernetes集群

:heart:爱心三连

1.看到这里了就点个在看支持下吧,你的 在看 是我创作的动力。

2.关注公众号 网管叨bi叨「每周为您分享原创技术文章」

3.特殊阶段,带好口罩,做好个人防护。

线上 Go 项目的 Docker 镜像应该怎么构建?

“在看转发” 是最大的支持


以上所述就是小编给大家介绍的《线上 Go 项目的 Docker 镜像应该怎么构建?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

这就是OKR

这就是OKR

【美】约翰·杜尔(John Doerr) / 曹仰锋、王永贵 / 中信出版社 / 2018-12 / 68.00元

这本书是传奇风险投资人约翰·杜尔的作品,揭示了OKR这一目标设定系统如何促使英特尔、谷歌等科技巨头实现爆炸性增长,以及怎样促进所有组织的蓬勃发展。 20世纪70年代,在英特尔担任工程师时,杜尔首次接触到OKR。之后,作为一个风险投资人,杜尔不遗余力地将这一管理智慧,分享给50多家公司和机构,包括谷歌、亚马逊、领英、脸书、比尔及梅琳达·盖茨基金会,甚至摇滚歌手波诺的公益项目。在杜尔的帮助下,任......一起来看看 《这就是OKR》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试