
上QQ阅读APP看书,第一时间看更新
4.5.4 使用多阶段Dockerfile对Go服务容器化
你在微服务系统中构建的Docker镜像是非常重要的。你会构建许多镜像,并且每个镜像都会构建很多很多次,这些镜像也将通过网络来回发送,很容易成为攻击者的目标。考虑到这一点,构建具有以下属性的镜像是有意义的:
·轻巧
·最小的攻击面
这可以通过使用适当的基础镜像来完成,例如,轻量级的Alpine就非常受欢迎。然而,我认为没有什么比scratch基础镜像更好。如果是基于Go的微服务,你可以创建仅包含服务二进制文件的镜像。让我们进一步深入并查看其中一项服务的Dockerfile,这些服务的Dockerfile几乎完全相同,只是服务名称有所不同。
你可以访问https://github.com/the-gigi/delinkcious/blob/master/svc/link_service/Dockerfile下载link_service的Dockerfile。
这里使用的是多阶段的Dockerfile,我们将使用标准Golang镜像来构建。构建的奥秘在最后一行,它会创建一个真正静态的、自包含的Golang二进制文件,不需要动态运行时库:

然后,我们将最终的二进制文件复制到scratch基础镜像中,构建一个最小、最安全的镜像。我们公开了服务监听的7070端口:
