暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

最佳实践:这才是构建 Go 语言 Docker 镜像该有的姿势

IT大咖说 2020-08-04
1878

本文通过 Go 语言的 Hello World 來介绍基于 Docker 的 Single build 及 Multiple build。

Single build

下面是 Go 语言 Hello World 代码:

package mainimport "fmt"func main() {    fmt.Println("Hello World!")}

接着用 alpine[1] 的 Go 语言 Image 来编译出可执行文件。

FROM golang:alpineWORKDIR /appADD . /appRUN cd /app && go build -o appENTRYPOINT ./app

接着执行如下编译指令:

$ docker build -t appleboy/go-app .$ docker run --rm appleboy/go-app

最后检查看看编译出来的 Image 大小,使用docker images | grep go-app,会发现大小为 258 MB

Multiple build

Multiple build 则是可以在Dockerfile使用多个不同的 Image 来源,请看看底下例子:

# build stageFROM golang:alpine AS build-envADD . /srcRUN cd /src && go build -o app# final stageFROM alpineWORKDIR /appCOPY --from=build-env /src/app /app/ENTRYPOINT ./app

从上面可以看到透过AS和--from互相沟通,以前需要写两个 Dockerfile,现在只要一个就可以搞定。

$ docker build -t appleboy/go-app .$ docker run --rm appleboy/go-app

会发现最后大小为 6.35 MB,比上面是不是小了很多。

最小 Image

6.35 MB 是最小的 Image 了吗?一个简单的 Hello World 可执行文件,用 Docker 包起来竟然要 6.35,其实不用这么大,我们可以透过 Dokcer 所提供的最小 Image:scratch[2],将二进制文件直接扔进去即可,在编译可执行文件时需加入特定参数才可以:

$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app

在通过 Docker 包起来:

FROM centurylink/ca-certsADD app /ENTRYPOINT ["/app"]

编译出来大小为:1.81MB,相信这是最小的 Image 了。

注:centurylink/ca-certs 是一个基于 Docker 的基础镜像,它基于 scratch[3] 镜像构建,并为所有标准证书颁发机构添加了根证书。

完整的 Dockerfile:

# build stageFROM golang:alpine AS build-envADD . /srcRUN cd /src && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app# final stageFROM centurylink/ca-certsCOPY --from=build-env /src/app /ENTRYPOINT ["/app"]

总结

Multiple build 非常方便,这样就可以将多个步骤全部合并在一个 Dockerfile 处理掉,像是底下例子:

from debian as build-essentialarg APT_MIRRORrun apt-get updaterun apt-get install -y make gccworkdir /srcfrom build-essential as foocopy src1 .run makefrom build-essential as barcopy src2 .run makefrom alpinecopy --from=foo bin1 .copy --from=bar bin2 .cmd ...
from debian as build-essentialarg APT_MIRRORrun apt-get updaterun apt-get install -y make gccworkdir /srcfrom build-essential as foocopy src1 .run makefrom build-essential as barcopy src2 .run makefrom alpinecopy --from=foo bin1 .copy --from=bar bin2 .cmd ...

用一个 Dockerfile 产生多个可执行文件,最后再用 alpine 打包成 Image。

本文作者:AppleBoy

原文链接:https://blog.wu-boy.com/2017/04/build-minimal-docker-container-using-multi-stage-for-go-app/

参考资料

[1]

alpine: https://hub.docker.com/_/alpine/

[2]

scratch: https://hub.docker.com/_/scratch/

[3]

scratch: https://registry.hub.docker.com/u/library/scratch/

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com

来都来了,走啥走,留个言呗~

 IT大咖说  |  关于版权 

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!

相关推荐

推荐文章

文章转载自IT大咖说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论