簡體   English   中英

使用 Docker 容器中的 go 1.10 構建緩存加速 Go 構建

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM