如何将 go mod 与本地包和 docker 一起使用?

Sli*_*ady 6 dependencies go dependency-management docker go-modules

github.com/myuser/mymainrepo我有两个 go 模块github.com/myuser/commonrepo

这是我在本地计算机中保存文件的方式

- allmyrepos  
 - mymainrepo
   - Dockerfile
   - go.mod
 - commonrepo
   - go.mod
Run Code Online (Sandbox Code Playgroud)

mymainrepo/go.mod

...
require (
  github.com/myuser/commonrepo
)

replace (
  github.com/myuser/commonrepo => ../commonrepo
)
Run Code Online (Sandbox Code Playgroud)

它运行良好,我可以用它进行本地开发。当我构建 mymainrepo 的 docker 映像时出现问题

mymainrepo/Dockerfile

...
WORKDIR /go/src/mymainrepo

COPY go.mod go.sum ./
RUN go mod download


COPY ./ ./
RUN go build -o appbinary
...
Run Code Online (Sandbox Code Playgroud)

这里replace替换github.com/myuser/commonrepo../commonrepo但在 Docker 中 /go/src/commonrepo不存在。

我正在 CI/CD 上构建 Docker 映像,该映像需要直接从远程 github url 获取,但我还需要在commonrepo. 我怎样才能两者兼得?

我试图将所有文件放入其中,GOPATH因此它是~/go/src/github.com/myuser/commonrepogo/src/github.com/myuser/mymainrepo. 我删除了该replace指令。但它会寻找从 github 下载的commonrepo内部内容。~/go/pkg/mod/...

Sys*_*tch 4

创建两个go.mod文件:一个用于本地开发,另一个用于您的构建。go.build.mod例如,您可以命名它。

将该指令保留replace在您的go.mod文件中,但将其从go.build.mod.

最后,在你的Dockerfile

COPY go.build.mod ./go.mod
COPY go.sum ./
Run Code Online (Sandbox Code Playgroud)