如何将 go mod 与本地包和 docker 一起使用?
How to use go mod with local package and docker?
我有两个 mod 规则 github.com/myuser/mymainrepo
和 github.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
...
此处 replace
将 github.com/myuser/commonrepo
替换为 ../commonrepo
但在 Docker 中 /go/src/commonrepo
不存在。
我正在 CI/CD 上构建 Docker 图像,需要直接从远程获取 github url 但我还需要在 [=] 上进行本地开发21=]。我怎样才能做到这两点?
我试图将我所有的文件都放在 GOPATH
中,所以它是 ~/go/src/github.com/myuser/commonrepo
和 go/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
- 我们知道 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
。
- 让我们在构建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 submit
或 make deploy
命令。
=> 生产就绪!
请注意,如果在 docker 构建过程中发生错误,它不会删除我们复制到 sample
的 core
文件夹。
如果您找到更好的解决方案,请告诉我。 ;)
我有两个 mod 规则 github.com/myuser/mymainrepo
和 github.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
...
此处 replace
将 github.com/myuser/commonrepo
替换为 ../commonrepo
但在 Docker 中 /go/src/commonrepo
不存在。
我正在 CI/CD 上构建 Docker 图像,需要直接从远程获取 github url 但我还需要在 [=] 上进行本地开发21=]。我怎样才能做到这两点?
我试图将我所有的文件都放在 GOPATH
中,所以它是 ~/go/src/github.com/myuser/commonrepo
和 go/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
- 我们知道 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
。
- 让我们在构建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 submit
或 make deploy
命令。
=> 生产就绪!
请注意,如果在 docker 构建过程中发生错误,它不会删除我们复制到 sample
的 core
文件夹。
如果您找到更好的解决方案,请告诉我。 ;)