亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何預構建所有必需的模塊并緩存它們

如何預構建所有必需的模塊并緩存它們

Go
喵喵時光機 2022-09-19 17:36:05
在構建 Docker 映像時,我知道我們可以添加一個層來緩存依賴項。但是需要建立依賴關系。此步驟非常耗時,在我的計算機上,僅構建sqlite3大約需要30秒。我也知道我可以用來構建一個特定的依賴項,但是有沒有辦法預構建所有依賴項列表?go build github.com/mattn/go-sqlite3go.mod我在這里發現了同樣的問題,但沒有答案。
查看完整描述

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


查看完整回答
反對 回復 2022-09-19
?
慕的地10843

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



查看完整回答
反對 回復 2022-09-19
  • 2 回答
  • 0 關注
  • 79 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號