2 回答
TA贡献1790条经验 获得超9个赞
Docker 在此处提供了有关此确切主题的文档。建议是像这样构建您的结构:Dockerfile
FROM --platform=${BUILDPLATFORM} docker.io/golang:1.16.7-alpine AS build
ARG TARGETOS
ARG TARGETARCH
WORKDIR /src
ENV CGO_ENABLED=0
COPY go.* .
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build \
GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example .
FROM scratch
COPY --from=build /out/example /
其中很多都是样板文件,如果您只为单个体系结构构建,则可以将其删除;与缓存相关的部分实际上只是:
FROM docker.io/golang:1.16.7-alpine AS build
WORKDIR /src
COPY go.* .
RUN go mod download
COPY . .
RUN --mount=type=cache,target=/root/.cache/go-build go build -o /out/example .
FROM scratch
COPY --from=build /out/example /
这会在 上挂载一个缓存目录,这是构建缓存的默认位置。首次构建映像时,它将填充此缓存。后续生成将重用缓存的文件。/root/.cache/go-buildgo
为此,必须使用 进行构建,即:DOCKER_BUILDKIT=1
DOCKER_BUILDKIT=1 docker build -t myimage .
或使用 :docker buildx
docker buildx build -t myimage .
我已经在本地对此进行了测试,它似乎按预期工作(我已经验证了在第一个构建之外的构建中,缓存目录是在运行之前填充的)。go-buildgo build
TA贡献1785条经验 获得超8个赞
这不会在 Docker 中进行测试,但应该可以正常工作。不过,它可能会进一步优化,或者进行修改以在更有限的构建环境中工作。
RUN go mod download && go list -f '{{ join .Deps "\n" }}' ./... | sort -u | grep -v '<your package import path>' | xargs go build- 2 回答
- 0 关注
- 108 浏览
添加回答
举报
