本篇内容介绍了“如何构建优化Go程序Docker镜像”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
多阶段构建方式,是在 Dockerfile
中使用多个 FROM
指令,每个 FORM
指令都是一个新的构建阶段,并且可以方便地复制之前阶段的构件。让我们来看一个简单的 Go
程序。代码如下。
点击此处您可以获取代码。
让我们来为它构建 Docker
镜像,Dockerfile
文件内容如下。
FROM golang:1.19-alpine WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN go build -o /main main.go ENTRYPOINT ["/main"]
完成后,我们得到了一个 359 MB大小的镜像。
现在让我们构建相同的程序,但使用多阶段构建:
FROM golang:1.19-alpine as builder WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN go build -o /main main.go FROM alpine:3 COPY --from=builder main /bin/main ENTRYPOINT ["/bin/main"]
完成后,我们居然得到了一个只有 12 MB 大小的 Docker
镜像。还不错,我们把镜像大小减少了约 30 倍。我们是如何完成的呢?
在第一种情况,使用单阶段构建,Docker
镜像中包含了以下内容。
golang:1.19-alpine -- 345.93 MB
source size -- 11.1 KB
编译后的应用程序大小 -- 6.5 MB
在第二种情况,我们先编译并构建了应用程序,然后将已经编译的结果复制到最后一个阶段。
alpine size:3 -- 5.54 MB
编译后的应用程序大小 -- 6.5 MB
答案是:能。但为此我们需要使用 Docker Scratch -- 它是一个 0 MB 的 Docker
镜像。
FROM golang:1.19-alpine as builder WORKDIR /build COPY go.mod . RUN go mod download COPY . . RUN CGO_ENABLED=0 GOOS=linux go build -o /main main.go FROM scratch COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ COPY --from=builder main /bin/main ENTRYPOINT ["/bin/main"]
完成后,我们的镜像大小为 6.66 MB。
“如何构建优化Go程序Docker镜像”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。