有一个
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 桥接网络?
您正在执行
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/)了解此事。