为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 构建所有下载的软件包

Golang 构建所有下载的软件包

Go
繁星coding 2022-09-05 17:57:32
我正在尝试为我的 go 应用程序构建一个 docker 映像,并且我想与编译应用程序的源代码分开构建所有包依赖项。下面是一个可能有帮助的示例:FROM ubuntu:focal# ... a bunch of run commands that install go and other binaries I needENV GOPATH=/root/goWORKDIR gadicCOPY go.mod .RUN go mod downloadRUN go build /root/go/pkg/... # this fails!!COPY src srcRUN go build path/to/main.go # I'd like to speed this step up by pre-compiling the packages main.go depends on当我尝试构建这个dockerfile时,我得到以下输出: > [ 8/19] RUN go build /root/go/pkg/...:#12 0.955 pattern /root/go/pkg/...: directory prefix /root/go/pkg outside available modules在构建应用程序之前,有没有办法构建我的应用程序所依赖的包/模块?main.go
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

您真正需要的是构建缓存,请参阅此内容

需要将两个文件夹挂载到构建容器中:

  • 哥帕斯

    这里我们设置为,用于存储下载的依赖项/root/go

  • 戈卡什

    默认值为 ,用于构建缓存/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=

执行:


第一次,你可以看到它下载了依赖项包,然后构建了不同的包。

$ 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")

}

然后,再次执行构建:


$ 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

...

从上面可以看出,它不再下载包(因为/root/go在不同的构建时间被重用)。而且,它只是 build ,对应于 的变化,没有与重建相关的包(因为 /root/.cache/go-build 作为 build cache 被重用)。command-line-argumentsmain.gogithub.com/phachon/go-logger


查看完整回答
反对 回复 2022-09-05
?
繁花如伊

TA贡献2012条经验 获得超12个赞

我认为您应该利用多阶段构建的优势。在第一阶段,使用安装了 Go 的 docker 映像。您可以使用此处提供的其中一个 https://hub.docker.com/_/golang。此时,您必须将源代码复制到容器中并在那里运行。go build


在下一步中,(例如)使用 alpine 映像并将可执行文件(和其他必填字段)复制到目标容器。


这是一个如何做到这一点的例子。


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

这有几个好处,最终图像的大小就是其中之一。


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信