我正在努力使用 gRPC 为 golang 微服务项目构建 docker 映像,但它失败了,我该怎么做?
这是我的项目结构。
projectDir->services->[app-proto, app-db, app-auth]
我生成的 protos golang 文件在 app-proto
目录中,我将它们导入到 app-db microservice go.mod 文件中,如下所示
go 1.16
require (
....
github.com/marvinhosea/tuma-app-proto/db v0.0.0
...
)
replace github.com/marvinhosea/tuma-app-proto/db => ../app-protos/db
这是我的 docker 文件
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o main .
EXPOSE 8080
CMD ["./main"]
这是我得到的错误
go: github.com/marvinhosea/tuma-app-proto/db@v0.0.0 (replaced by ../app-proto/db): reading /app-protos/db/go.mod: open /app-proto/db/go.mod: no such file or directory
答案 0 :(得分:0)
问题是您的 Docker 构建上下文不包括您与 replace
中使用的 go.mod
指令一起使用的相对路径。
假设你的目录结构是这样的:
app-proto/
app-proto/db/defs.pb.go
app-proto/db/defs.proto
tuma-app-proto/
tuma-app-proto/db/Dockerfile
tuma-app-proto/db/go.mod
tuma-app-proto/db/go.sum
tuma-app-proto/db/*.go
并从 tuma-app-proto/db/
运行您的 docker 构建:
docker build -t myimage . # . indicates the docker context directory
这将看到您的主要 Go 代码,但不会您的 protobuf 目录 (app-proto/db/
)。 (您不能从 docker 上下文根使用 ..
并查看更高级别的目录)
最简单的解决方案是将您的上下文向上移动 - 自然也是您的 Dockerfile
- 以包含两个目录。例如
Dockerfile
app-proto/db/
tuma-app-proto/db/
并更新您的 Dockerfile 的 COPY
以使用这个新的路径结构:
#
# copy proto files
#
WORKDIR /app/app-proto/db
COPY app-proto/db/* ./
#
# copy go code:
#
WORKDIR /app/tuma-app-proto/db
COPY tuma-app-proto/db/* ./
RUN go mod download
RUN go build -o main .
EXPOSE 8080
CMD ["./main"]