2 回答

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超2個贊
您真正需要的是構(gòu)建緩存,請參閱此內(nèi)容。
需要將兩個文件夾掛載到構(gòu)建容器中:
哥帕斯
這里我們設(shè)置為,用于存儲下載的依賴項(xiàng)
/root/go
戈卡什
默認(rèn)值為 ,用于構(gòu)建緩存
/root/.cache/go-build
下面是一個最小示例。
Dockerfile:
# syntax = docker/dockerfile:1.2
FROM golang
ENV GOPATH=/root/go
WORKDIR /root
COPY main.go .
COPY go.mod .
COPY go.sum .
RUN --mount=type=cache,mode=0755,target=/root/.cache/go-build --mount=type=cache,mode=0755,target=/root/go go build -v main.go
main.go:
package main
import (
_ "github.com/phachon/go-logger"
)
func main() {
}
go.mod:
module trial
go 1.14
require github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea
go.sum:
github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM=
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA=
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM=
github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea h1:IkOONr/u7Wy+j2R4r1eMV8PEuN4kmOhZZNaYxDOF+KQ=
github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea/go.mod h1:WBIWFH/iYYvuApCvPU+/R6hfX6v0Ogu4apwf0UgzVF0=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
執(zhí)行:
第一次,你可以看到它下載了依賴項(xiàng)包,然后構(gòu)建了不同的包。
$ export DOCKER_BUILDKIT=1
$ docker build --progress=plain -t abc:1 . --no-cache
...
#14 [stage-0 6/6] RUN --mount=type=cache,mode=0755,target=/root/.cache/go-bu...
#14 3.100 go: downloading github.com/phachon/go-logger v0.0.0-20191215032019-86e4227f71ea
#14 3.330 go: downloading github.com/fatih/color v1.7.0
#14 3.331 go: downloading github.com/mailru/easyjson v0.7.0
#14 3.523 go: downloading github.com/mattn/go-colorable v0.1.4
#14 3.561 go: downloading github.com/mattn/go-isatty v0.0.11
#14 3.731 go: downloading golang.org/x/sys v0.0.0-20191026070338-33540a1f6037
#14 5.058 github.com/mailru/easyjson/buffer
#14 5.063 golang.org/x/sys/unix
#14 5.070 github.com/mailru/easyjson/jlexer
#14 5.077 github.com/mailru/easyjson/jwriter
#14 5.087 github.com/phachon/go-logger/utils
#14 5.174 github.com/mailru/easyjson
#14 5.346 github.com/mattn/go-isatty
#14 5.355 github.com/mattn/go-colorable
#14 5.368 github.com/fatih/color
#14 5.396 github.com/phachon/go-logger
#14 5.451 command-line-arguments
#14 DONE 7.4s
...
第二次,我改成了下一個:main.go
main.go:
package main
import (
_ "github.com/phachon/go-logger"
"fmt"
)
func main() {
fmt.Println("helloworld")
}
然后,再次執(zhí)行構(gòu)建:
$ export DOCKER_BUILDKIT=1
$ docker build --progress=plain -t abc:1 . --no-cache
...
#14 [stage-0 6/6] RUN --mount=type=cache,mode=0755,target=/root/.cache/go-bu...
#14 1.469 command-line-arguments
#14 DONE 3.2s
...
從上面可以看出,它不再下載包(因?yàn)?root/go在不同的構(gòu)建時間被重用)。而且,它只是 build ,對應(yīng)于 的變化,沒有與重建相關(guān)的包(因?yàn)?/root/.cache/go-build 作為 build cache 被重用)。command-line-argumentsmain.gogithub.com/phachon/go-logger

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個贊
我認(rèn)為您應(yīng)該利用多階段構(gòu)建的優(yōu)勢。在第一階段,使用安裝了 Go 的 docker 映像。您可以使用此處提供的其中一個 https://hub.docker.com/_/golang。此時,您必須將源代碼復(fù)制到容器中并在那里運(yùn)行。go build
在下一步中,(例如)使用 alpine 映像并將可執(zhí)行文件(和其他必填字段)復(fù)制到目標(biāo)容器。
這是一個如何做到這一點(diǎn)的例子。
FROM golang:alpine AS build-env
RUN apk --no-cache add build-base git bzr mercurial gcc
ADD . /src
RUN cd /src && go build -o goapp
# final stage
FROM alpine
WORKDIR /app
COPY --from=build-env /src/goapp /app/
ENTRYPOINT ./goapp
這有幾個好處,最終圖像的大小就是其中之一。
- 2 回答
- 0 關(guān)注
- 164 瀏覽
添加回答
舉報