我希望能够减小Golang应用的Docker镜像
为什么要这么做?
想要在Docker中运行应用程序时,容器镜像的大小会变得很大。
我希望尽量减小这个镜像的大小。
怎么做呢?
这次以 Dockerfile 为主,将 go 文件设定为公共文件。
要使用的程序如下:main.go。
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, World")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
在一个简单的Web服务器上运行这个,并使用curl进行测试,会返回Hello, World。
顺便提一下,目录结构如下所示。
过去的方式
为了比较,以下是先前的Docker文件介绍。
之前的/dockerfile
FROM golang:1.10-alpine3.7
ADD ./ ./
RUN go build main.go
CMD [ "/go/main" ]
我在处理go build方面的内容时做得很简单。让我们尝试用docker build这个命令进行构建。
$ docker build -t golang-docker-before before/
Successfully tagged golang-docker-before:latest
当看到这个后,可以确认build已经正常完成了。
接下来检查一下图像的尺寸。
REPOSITORY TAG IMAGE ID CREATED SIZE
golang-docker-before latest b289ef900ec0 3 minutes ago 264MB
golang 1.10-alpine3.7 7f9031684cc1 3 days ago 257MB
刚刚制作的golagn-docker-before镜像的大小怎么样?
有264M……很大
其实,golang的镜像本来就很大
现在要将其变小
需要什么?
用 Go 语言创建的应用需要什么呢?
使用 Go 语言进行构建会生成一个文件
也就是说只需要这个文件就可以了
就像这次的例子,不需要其他的包或者 main.go,只需要 main。
将图像大小缩小
只要有main文件,只需要在构建时将main文件提取出来。
因此,在这里可以使用Docker进行多阶段构建。
关于多阶段构建,可以查看Docker文档。
Docker文件将如下所示:
在中国境内,仅需要一种选择:之后的Dockerfile。
FROM golang:1.10-alpine3.7 as build
ADD ./ ./
RUN go build main.go
FROM alpine:latest
COPY --from=build /go/main /app/main
CMD [ "/app/main" ]
让我们来看一下Dockerfile,在第一个FROM之前,图像旁边有一个build选项。可以任意添加文字。
使用golang的镜像进行go build操作。
生成的main文件位于/go/main目录中,只需要提取它。
在第二个FROM中使用较小的alpine镜像。
使用COPY命令及–from=build参数,将内容从指定镜像的build文件夹复制到/app/main目录。
最后,指定CMD命令并结束。
原文:修正后的image尺寸为
中文翻译:修正后的图像尺寸为
$ docker build -t golang-docker-after after/
$ docker images
golang-docker-after latest c9e1ed0e2383 38 minutes ago 11MB
<none> <none> fece0e20da1f 38 minutes ago 264MB
golang-docker-before latest b289ef900ec0 About an hour ago 264MB
golang 1.10-alpine3.7 7f9031684cc1 3 days ago 257MB
alpine latest 196d12cf6ab1 7 weeks ago 4.41MB
比较 golang-docker-after 和 golang-docker-before 的图像大小。
结果如下:
golang-docker之后:11MB
golang-docker之前:264MB
总结
首先,将图像大小减小的好处就是可以加快docker pull的速度。在频繁使用docker pull的环境中,这将是有效的。你可以在GitHub上查看我使用的代码。
非常感谢你。