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 基础镜像

点赞(0)

评论列表 共有 0 评论

暂无评论

微信服务号

微信客服

淘宝店铺

support@elephdev.com

发表
评论
Go
顶部