为了账号安全,请及时绑定邮箱和手机立即绑定

用于 golang 的 Docker 多阶段构建创建大图像

用于 golang 的 Docker 多阶段构建创建大图像

Go
料青山看我应如是 2023-04-04 15:26:29
我想为我的 gaoling 项目使用多阶段构建,当我在本地为 linux/windows/Mac 构建项目时,我得到了12.6 mb 的大小,我目前有一个小的 gaoling CLI 程序。现在我想用 lightwhigt docker image 构建它并使用选项scratch构建它as我使用以下内容,但是当我检查图像时,我看到它的大小366MB,知道我在这里遗漏了什么吗?它应该小于 20MB……#build stageFROM golang:alpine as builderWORKDIR /go/src/tzfADD . /go/src/tzfRUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzfRUN apk add --no-cache gitFROM golang:alpine RUN mkdir /buildADD . /build/WORKDIR /buildRUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzfFROM scratchCOPY --from=builder /build/main /app/WORKDIR /appCMD [“./ova -v"]
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您应该首先使用一个golang:alpine容器来构建应用程序,然后使用一个容器alpine来运行编译后的应用程序。


是这样的:


# builder

FROM golang:alpine AS builder

WORKDIR /go/src/tzf

ADD . /go/src/tzf

RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzf


# runner

FROM alpine

WORKDIR /app

COPY --from=builder /build/main /app/

CMD [“./ova -v"]

应该会产生一个占地面积小的容器。


查看完整回答
反对 回复 2023-04-04
?
慕沐林林

TA贡献2016条经验 获得超9个赞

当您构建最终图像时,请注意只复制您希望最终出现在图像中的确切文件。在这里让您的二进制文件成为图像的 ENTRYPOINT 是有意义的,因为实际上您无法用它做任何其他事情。


我可能会像这样制作一个两阶段管道:


# size of this stage doesn't matter; use the standard image

FROM golang AS builder

WORKDIR /go/src/tzf

ADD . ./

RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o /ova tzf


FROM scratch

# only copy the one file, may as well put it in /

COPY --from=builder /ova /ova

ENTRYPOINT ["/ova"]

# if you want to launch it with default options, you can

# CMD ["-v"]


查看完整回答
反对 回复 2023-04-04
  • 2 回答
  • 0 关注
  • 74 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信