【问题标题】:Docker multistage build for golang create big image用于 golang 创建大图像的 Docker 多阶段构建
【发布时间】:2018-09-16 19:03:56
【问题描述】:

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

【问题讨论】:

  • 调试建议:如果您暂时将最终图像更改为FROM busybox,您可以在其中启动一个shell来查看图像中的内容。

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


【解决方案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"]

应该是一个占用空间小的容器。

【讨论】:

    【解决方案2】:

    当您构建最终映像时,请注意仅复制您希望在映像中结束的确切文件。在这里将二进制文件作为图像的入口点是有意义的,因为实际上您无能为力。

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

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

    【讨论】:

    • 你太棒了 :) 这解决了这个问题。非常感谢你!!! .一个问题,有没有一种简单的方法可以查看这个容器?
    • 现在大小为 11.5 MB,但既然这是一个 cli 程序,我如何检查它是否工作?
    • 当我在本地运行它时,我可以运行命令 ova -v 并且它可以工作,我看到了 cli 的版本,我如何使用 docker 检查它以查看一切是否正常?
    • 使用未注释的 Dockerfile 版本,构建镜像后,您应该能够docker run imagename -v(镜像名称之后的所有内容都作为命令行参数传递给入口点)。请记住,图像只有二进制文件,而不是外壳,所以很难在它周围翻来覆去。
    • @JennyM 我用来进行健全性测试的一种方法是在草稿图像中的副本之后添加RUN ["/ova", "-v"] 之类的内容。诀窍是使用不使用 shell 的 [] 运行语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多