有没有办法设置多个本地 Go 模块,这样它们就可以 运行 在一个 Docker 容器中而不需要从 Github 中拉出?
Is there a way to set up multiple Local Go Modules, so they can run inside one Docker container without pulling from Github?
所以我的目标是在多个docker容器和一个Go模块中设置一个本地开发环境,其中包含多个Go服务(均为独立模块)运行ning,所有服务都可以使用启动连接到数据库等的新服务,而无需在每个 module/service.
中重复此代码
所以我的结构看起来像这样(在 $GOPATH/src/github.com/name/backend/ 中):
|--services
| |--service1
| |--Dockerfile
| |--main.go
| |--go.mod
| |--service2
| |--Dockerfile
| |--main.go
| |--go.mod
|--serviceHelper
| |--serviceHelper.go
| |--go.mod
我的 Docker 文件目前只是一个普通的 DockerGo 文件:
FROM golang:alpine AS build-env
WORKDIR /backend
ADD . /backend
RUN cd /backend && go build -o service1
FROM alpine
RUN apk update && \
apk add ca-certificates && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
WORKDIR /backend
COPY --from=build-env /backend/service1 /backend
EXPOSE 8080
ENTRYPOINT ["./service1"]
我的 go.mod 文件也只是:
module github.com/name/backend/services/service1
go 1.17
但我现在遇到的问题是,您要么必须从 github 存储库中提取一个模块,但我不想这样做,或者将 serviceHelper 代码放在每个模块中服务,我也不想做。
我在 VSCode 工作,从那以后我了解到您必须将单个模块放入单个工作区文件夹中。我仍然无法设法在本地配置模块以在一项服务中导入 github.com/gorilla/mux
等普通包和我的本地包。我使用的是 Apple M1,我希望这不会造成问题。
我需要如何配置 go.mod 文件、Docker 文件和 Go 导入,以便我可以在编辑器中正常调试 Go(即 serviceHelper 模块不仅仅是直接加载到 Docker 容器中),以及 运行 本地的所有内容,而无需从 github?
获取 serviceHelper
更新:
我已经尝试了很多变体,但是有了这个(感谢您的回答 colm.anseo),我收到的错误消息最少,但它仍然尝试连接到 github,这是我不想要的.
所以更新后的 go.mod 文件看起来像:
module github.com/name/backend/services/service1
go 1.17
require (
github.com/name/backend/serviceHelper v1.0.0
github.com/gorilla/mux v1.8.0
)
replace github.com/name/backend/serviceHelper => ../../serviceHelper
然后当我尝试用 go mod tidy
构建一个新的 go.sum 时,出现了这个错误(这就是我的意思是“以及 运行 一切都在本地,而无需来源来自 github" 的 serviceHelper",因为我之前遇到过这个错误):
github.com/name/backend/servicehelper: cannot find module providing package github.com/name/backend/servicehelper: module github.com/name/backend/servicehelper: git ls-remote -q origin in /Users/myName/go/pkg/mod/cache/vcs/...: exit status 128:
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我不希望它连接到 github,我只希望它在本地连接到 运行。在 colm.anseo 的回答的帮助下,我想我知道如何创建一个有效的 Docker 文件,所以这不再是一个问题。
如果您还没有准备好将代码发布到互联网 git 存储库(例如 github.com
),您可以在 go.mod
中使用 replace directive:
module github.com/me/my_app
go 1.17
require (
github.om/gorilla/handlers v1.5.1
github.com/me/my_srv1
)
replace github.com/me/my_srv1 => ./my_srv1
在您的 Go 代码中,您可以导入此代码,就像它来自互联网一样:
// go code
import (
"github.om/gorilla/handlers"
"github.com/me/my_srv1"
)
在您的 Docker 上下文中,您必须确保目录 ./my_srv1
已复制并可在与 go build
.
相同的相对路径中访问
go build
与 go.mod
结合将从互联网上提取 gorilla/mux
包 - 但使用本地开发目录代替您的(尚未发布)回购
replace github.com/name/backend/serviceHelper => ../../serviceHelper
...
github.com/name/backend/servicehelper: cannot find module
导入区分大小写。我建议在您的导入、替换语句和您正在导入的包的 go.mod 文件中将所有内容都设为小写。
所以我的目标是在多个docker容器和一个Go模块中设置一个本地开发环境,其中包含多个Go服务(均为独立模块)运行ning,所有服务都可以使用启动连接到数据库等的新服务,而无需在每个 module/service.
中重复此代码所以我的结构看起来像这样(在 $GOPATH/src/github.com/name/backend/ 中):
|--services
| |--service1
| |--Dockerfile
| |--main.go
| |--go.mod
| |--service2
| |--Dockerfile
| |--main.go
| |--go.mod
|--serviceHelper
| |--serviceHelper.go
| |--go.mod
我的 Docker 文件目前只是一个普通的 DockerGo 文件:
FROM golang:alpine AS build-env
WORKDIR /backend
ADD . /backend
RUN cd /backend && go build -o service1
FROM alpine
RUN apk update && \
apk add ca-certificates && \
update-ca-certificates && \
rm -rf /var/cache/apk/*
WORKDIR /backend
COPY --from=build-env /backend/service1 /backend
EXPOSE 8080
ENTRYPOINT ["./service1"]
我的 go.mod 文件也只是:
module github.com/name/backend/services/service1
go 1.17
但我现在遇到的问题是,您要么必须从 github 存储库中提取一个模块,但我不想这样做,或者将 serviceHelper 代码放在每个模块中服务,我也不想做。
我在 VSCode 工作,从那以后我了解到您必须将单个模块放入单个工作区文件夹中。我仍然无法设法在本地配置模块以在一项服务中导入 github.com/gorilla/mux
等普通包和我的本地包。我使用的是 Apple M1,我希望这不会造成问题。
我需要如何配置 go.mod 文件、Docker 文件和 Go 导入,以便我可以在编辑器中正常调试 Go(即 serviceHelper 模块不仅仅是直接加载到 Docker 容器中),以及 运行 本地的所有内容,而无需从 github?
获取 serviceHelper更新: 我已经尝试了很多变体,但是有了这个(感谢您的回答 colm.anseo),我收到的错误消息最少,但它仍然尝试连接到 github,这是我不想要的. 所以更新后的 go.mod 文件看起来像:
module github.com/name/backend/services/service1
go 1.17
require (
github.com/name/backend/serviceHelper v1.0.0
github.com/gorilla/mux v1.8.0
)
replace github.com/name/backend/serviceHelper => ../../serviceHelper
然后当我尝试用 go mod tidy
构建一个新的 go.sum 时,出现了这个错误(这就是我的意思是“以及 运行 一切都在本地,而无需来源来自 github" 的 serviceHelper",因为我之前遇到过这个错误):
github.com/name/backend/servicehelper: cannot find module providing package github.com/name/backend/servicehelper: module github.com/name/backend/servicehelper: git ls-remote -q origin in /Users/myName/go/pkg/mod/cache/vcs/...: exit status 128:
ERROR: Repository not found.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
我不希望它连接到 github,我只希望它在本地连接到 运行。在 colm.anseo 的回答的帮助下,我想我知道如何创建一个有效的 Docker 文件,所以这不再是一个问题。
如果您还没有准备好将代码发布到互联网 git 存储库(例如 github.com
),您可以在 go.mod
中使用 replace directive:
module github.com/me/my_app
go 1.17
require (
github.om/gorilla/handlers v1.5.1
github.com/me/my_srv1
)
replace github.com/me/my_srv1 => ./my_srv1
在您的 Go 代码中,您可以导入此代码,就像它来自互联网一样:
// go code
import (
"github.om/gorilla/handlers"
"github.com/me/my_srv1"
)
在您的 Docker 上下文中,您必须确保目录 ./my_srv1
已复制并可在与 go build
.
go build
与 go.mod
结合将从互联网上提取 gorilla/mux
包 - 但使用本地开发目录代替您的(尚未发布)回购
replace github.com/name/backend/serviceHelper => ../../serviceHelper
...
github.com/name/backend/servicehelper: cannot find module
导入区分大小写。我建议在您的导入、替换语句和您正在导入的包的 go.mod 文件中将所有内容都设为小写。