使用主机缓存构建 Dockerfile Go 应用程序

问题描述 投票:0回答:1

有一个

Dockerfile

FROM golang as builder
RUN apt update && apt upgrade -y
WORKDIR /srv
ADD . /srv
RUN --mount=type=cache,target=/root/.cache/go-build \
  go mod download && \
  go generate ./... && \
  go build -o app cmd/main.go
CMD ["/srv/app"]

据我了解,

docker build
不得下载每个新构建的依赖项并重用主机绑定的缓存。但事实并非如此。

有人可以建议吗,为什么?

另一个想法是使用本地 go mod 缓存,但是我们如何让

docker build
访问主机网络/docker compose 桥接网络?

docker go continuous-integration
1个回答
0
投票

您正在执行

go generate
go build
的同一 RUN 命令下载依赖项,使所有三个步骤成为同一 layer 的一部分。这样,docker就不能只缓存依赖项,因为它是按layer来缓存的。

推荐的方法是将您希望能够独立缓存的层分开。

RUN go mod download
RUN go generate ./...
RUN go build -o app cmd/main.go

etc...

此外,您似乎正在使用构建器模式,但将构建器作为最终映像运行。这将产生不必要的大图像(数百MB而不是数十MB)。检查[多阶段构建] https://docs.docker.com/build/building/multi-stage/)了解此事。

© www.soinside.com 2019 - 2024. All rights reserved.