【问题标题】:How to use go mod with local package and docker?如何将 go mod 与本地包和 docker 一起使用?
【发布时间】:2020-08-22 17:56:39
【问题描述】:

我有两个 go 模块 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
)

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

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 获取,但我还需要在 commonrepo 上进行本地开发。我怎样才能做到这两点?

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

【问题讨论】:

  • 您能解决问题吗?我有完全一样的问题。你能分享你的 Dockerfile 吗?

标签: docker go dependencies dependency-management go-modules


【解决方案1】:

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

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

最后,在你的Dockerfile

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

【讨论】:

  • 好的。但是,如果我还想保留构建的“替换”怎么办,有没有办法不创建 2 个 go.mod 文件?
  • @ArjunAjith 据我所知。但如果两者的替换相同,只需使用一个 .mod 文件并在映像构建步骤中复制所需的资源。
【解决方案2】:

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

|---sample
|   |---...
|   |---go.mod
|   |---Dockerfile
|---core
|   |---...
|   |---go.mod
  1. 我们知道 docker build 在找不到我们的本地模块时会出错。让我们在构建器过程中创建一个:
# 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/

然后命令,make buildsample 目录中。

您可以随意创建make submitmake deploy 命令。

=> 生产就绪!

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2019-03-10
    • 2014-10-03
    • 1970-01-01
    • 2018-11-08
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多