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

Docker multistage build for golang create big image

当我在本地为 linux/windows/Mac 构建项目时,我想为我的 gaoling 项目使用多阶段构建 我有 12.6 MB 的大小,我目前有小的 gaoling CLI 程序。

现在我想用 scratch 选项从 lightwhigt docker 图像构建它并构建 as

我使用以下内容,但是当我检查图像时,我看到它的大小 366MB ,知道我在这里遗漏了什么吗? 它应该小于 20MB…

#build stage
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
RUN apk add --no-cache git



FROM golang:alpine 
RUN mkdir /build
ADD . /build/
WORKDIR /build
RUN CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -o ova tzf
FROM scratch
COPY --from=builder /build/main /app/
WORKDIR /app
CMD [“./ova -v"]

您应该首先使用 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"]

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

构建最终映像时,请注意仅复制您希望最终出现在映像中的文件。在这里让你的二进制文件成为图像的 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"]