我希望能够减小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上查看我使用的代码。

非常感谢你。

广告
将在 10 秒后关闭
bannerAds