[英]Speeding up Go builds with go 1.10 build cache in Docker containers
我有一個帶有大型vendor/
目錄的 Go 項目,幾乎從不改變。
我正在嘗試使用新的go 1.10構建緩存功能來加速我在本地 Docker 引擎中的構建。
避免重新編譯我的vendor/
目錄就足夠優化了。 所以我正在嘗試為 Python 做與這個常見的 Dockerfile 模式等效的 Go:
FROM python
COPY requirements.txt . # <-- copy your dependency list
RUN pip install -r requirements.txt # <-- install dependencies
COPY ./src ... # <-- your actual code (everything above is cached)
同樣我試過:
FROM golang:1.10-alpine
COPY ./vendor ./src/myproject/vendor
RUN go build -v myproject/vendor/... # <-- pre-build & cache "vendor/"
COPY . ./src/myproject
但是,這會給出“找不到包”錯誤(可能是因為您也無法直接在 vendor/ 中構建東西)。
有沒有人能夠解決這個問題?
這對我有用:
FROM golang:1.10-alpine
WORKDIR /usr/local/go/src/github.com/myorg/myproject/
COPY vendor vendor
RUN find vendor -maxdepth 2 -mindepth 2 -type d -exec sh -c 'go install -i github.com/myorg/myproject/{}/... || true' \;
COPY main.go .
RUN go build main.go
它確保首先安裝供應商的庫。 只要你不改變圖書館,你就很好。
只需使用go install -i ./vendor/...
。
考慮以下 Dockerfile:
FROM golang:1.10-alpine
ARG APP
ENV PTH $GOPATH/src/$APP
WORKDIR $PTH
# Pre-compile vendors.
COPY vendor/ $PTH/vendor/
RUN go install -i ./vendor/...
ADD . $PTH/
# Display time taken and the list of the packages being compiled.
RUN time go build -v
您可以通過以下方式對其進行測試:
docker build -t test --build-arg APP=$(go list .) .
在我正在處理的項目中,沒有預編譯,每次需要大約 12 秒,90 多個包,之后,大約需要 1.2 秒,只有 3 個(只有本地包)。
如果您仍然有“找不到包”,則表示缺少供應商。 重新運行dep ensure
應該修復它。
另一個與 Go 無關的技巧是讓你的.dockerignore
以*
開頭。 即忽略所有內容,然后將您需要的內容列入白名單。
從 Go 1.11 開始,您將使用 go 模塊來完成此操作;
FROM golang
WORKDIR /src/myproject
COPY go.mod go.sum ./ # <-- copy your dependency list
RUN go mod download # <-- install dependencies
COPY . . # <-- your actual code (everything above is cached)
只要go.sum
不變, go mod download
創建的鏡像層就會從緩存中復用。
單獨使用go mod download
對我沒有任何幫助。
最終對我有用的是利用buildkit來掛載 Go 的構建緩存。
這是引導我使用此功能的文章。
我的 Dockerfile 看起來像這樣
FROM golang AS build
WORKDIR /go/src/app
COPY go.mod ./
COPY go.sum ./
RUN go mod download
COPY . ./
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
go build -o /my-happy-app
對於本地開發,這對我來說完全不同,將構建時間從 1.5 分鍾更改為 3 秒。
我正在使用 colima(在我的 Mac 上運行 Docker。只是提到這一點,因為我沒有使用 Docker for Mac,但它應該可以正常工作)
colima version 0.4.2
git commit: f112f336d05926d62eb6134ee3d00f206560493b
runtime: docker
arch: x86_64
client: v20.10.9
server: v20.10.11
還有 golang 1.17,所以這不是 1.10 的具體答案。
我在這里從 docker compose 的 cli dockerfile 中獲取了這個設置。
你的旅費可能會改變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.