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"]
当我在本地为 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"]