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 關注
- 79 瀏覽
添加回答
舉報