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

How to use go mod with local package and docker?

我有两个 mod 规则 github.com/myuser/mymainrepogithub.com/myuser/commonrepo

这是我在本地计算机中获取文件的方式

- allmyrepos  
 - mymainrepo
   - Dockerfile
   - go.mod
 - commonrepo
   - go.mod

mymainrepo/go.mod

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

replace (
  github.com/myuser/commonrepo => ../commonrepo
)

它运行良好,我可以用它进行本地开发。当我构建 docker mymainrepo

图像时出现问题

mymainrepo/Dockerfile

...
WORKDIR /go/src/mymainrepo

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


COPY ./ ./
RUN go build -o appbinary
...

此处 replacegithub.com/myuser/commonrepo 替换为 ../commonrepo 但在 Docker 中 /go/src/commonrepo 不存在。

我正在 CI/CD 上构建 Docker 图像,需要直接从远程获取 github url 但我还需要在 [=] 上进行本地开发21=]。我怎样才能做到这两点?

我试图将我所有的文件都放在 GOPATH 中,所以它是 ~/go/src/github.com/myuser/commonrepogo/src/github.com/myuser/mymainrepo。我删除了 replace 指令。但它会在 ~/go/pkg/mod/... 中查找 commonrepo,这是从 github.

下载的

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

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

中删除

最后,在你的 Dockerfile:

COPY go.build.mod ./go.mod
COPY go.sum ./

即使投票的答案对我不起作用,我仍然找不到其他更好的解决方案。这是我为我完成的一个技巧。这是执行此操作的示例结构:

|---sample
|   |---...
|   |---go.mod
|   |---Dockerfile
|---core
|   |---...
|   |---go.mod
  1. 我们知道 docker 在找不到我们的本地模块时会出现构建错误。让我们在构建过程中制作一个:
# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.16.3-buster AS builder

# Copy core library
RUN mkdir /core
COPY core/ /core

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary
RUN go build -o /app/sample cmd/main.go
...
...

好的,我们的工作目录是/app,我们的核心库放在它旁边/core

  1. 让我们在构建docker图像时做个小技巧!是的,你知道的。
cp -R ../core . && docker build --tag sample-service . && rm -R core/

更新 更好的方法是在 Dockerfile 旁边创建一个 Makefile,内容如下:

build:
    cp -R ../core .
    docker build -t sample-service .
    rm -R core/

然后命令,在sample目录下make build

您可以根据需要创建 make submitmake deploy 命令。

=> 生产就绪!

请注意,如果在 docker 构建过程中发生错误,它不会删除我们复制到 samplecore 文件夹。

如果您找到更好的解决方案,请告诉我。 ;)