FROM golang:1.18beta1-bullseye as builder
WORKDIR /build
COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app main.go
FROM gcr.io/distroless/base-debian11
COPY --from=builder /build/app /app
ENTRYPOINT ["/app"]
使用多阶段构建来保持我的镜像大小。
第一阶段是Go 官方镜像
第二阶段是Distroless
在 Distroless 之前,我使用的是Alpine 官方镜像,
网上有很多关于选择哪个是 Go 的最佳基础镜像的讨论。
在阅读了一些博客后,我发现 Distroless 是一个小而安全的基础镜像。
所以我坚持了一段时间
记住将 Distroless Debian 版本与 Go 官方映像 Debian 版本相匹配
FROM golang:1.18beta1-bullseye as builder
这是我用作构建阶段的 Go 图像
WORKDIR /build
COPY go.mod .
COPY go.sum .
COPY vendor .
COPY . .
我/build过去常常强调我正在该目录中构建一些东西。
COPY如果您使用足够多的 Go,这 4行就很熟悉了。
首先是go.mod和go.sum,因为它定义转到模块。
第二个是vendor因为我用的很多,这个不是必须的但是我用它是因为我不想每次构建Dockerfile时都需要重新下载Go模块
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 GOAMD64=v3 go build -o ./app main.go
这是我构建 Go 程序的地方。
CGO_ENABLED=0因为我不想弄乱 C 库。
GOOS=linux GOARCH=amd64很容易解释,Linux 与 x86-64。
GOAMD64=v3自Go 1.18以来是新的,
我使用 v3 是因为我在Arch Linux rfcs 中阅读了有关 AMD64 版本的信息。TLDR 的较新计算机已经是 x86-64-v3
FROM gcr.io/distroless/base-debian11
COPY --from=builder /build/app /app
ENTRYPOINT ["/app"]
最后,我复制app到 Distroless 基础镜像
发表评论 取消回复