Docker为golang打造多级形象

Docker为golang打造多级形象,docker,go,docker-compose,dockerfile,docker-multi-stage-build,Docker,Go,Docker Compose,Dockerfile,Docker Multi Stage Build,当我在本地为linux/windows/Mac构建项目时,我想为我的高陵项目使用多阶段构建 我得到了12.6MB的大小,我现在有一个小的高陵CLI程序 现在我想用scratch选项和buildas 我使用了以下内容,但是当我检查图像时,我看到它的大小是366MB,你知道我这里缺少了什么吗? 它应该小于20MB #build stage FROM golang:alpine as builder WORKDIR /go/src/tzf ADD . /go/src/tzf RUN CGO_ENABL

当我在本地为linux/windows/Mac构建项目时,我想为我的高陵项目使用多阶段构建 我得到了12.6MB的大小,我现在有一个小的高陵CLI程序

现在我想用
scratch
选项和build
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"]

应该会产生一个占用空间小的容器。

当您构建最终映像时,请小心仅复制您希望最终在映像中显示的确切文件。在这里,让你的二进制文件成为图像的入口点是有意义的,因为你可以用它做任何事情

我可以这样做一个两级管道:

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

调试建议:如果您临时将最终映像从busybox更改为
,您可以在其中启动一个shell来查看映像中的内容。您太棒了:)这就解决了问题。非常感谢。有一个问题,我可以用一种简单的方法来查看这个容器吗?现在容器的大小是11.5 MB,但既然这是一个cli程序,我如何检查它是否正常工作?当我在本地运行它时,我可以运行command
ova-v
并且它正常工作,我可以看到cli的版本,我如何与docker一起检查它以查看是否一切正常?对于docker文件的未注释版本,在构建映像后,您应该能够
docker运行imagename-v
(映像名称作为命令行参数传递到入口点后的所有操作)。请记住,该图像只有二进制文件,而没有外壳,因此很难对其进行检查。@JennyM我用来进行健全性测试的一种方法是在scratch图像中的副本后添加类似于
RUN[“/ova”、“-v”]
的内容。诀窍是使用不使用shell的
[]
运行语法。