用于golang的Docker多阶段构建可创建大形象

时间:2018-09-16 19:03:56

标签: docker go docker-compose dockerfile docker-multi-stage-build

当我在本地为linux / windows / Mac构建项目时,我想对我的gailing项目使用多阶段构建 我的大小为 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"]

2 个答案:

答案 0 :(得分:1)

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

应该导致占用空间较小的容器。

答案 1 :(得分:0)

构建最终映像时,请注意仅复制要最终显示在映像中的确切文件。在这里使二进制文件成为图像的入口点是有意义的,因为实际上您无能为力。

我可能会像这样建立一个两阶段的管道:

# 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"]