构建 golang 微服务 gRPC Docker 镜像

时间:2021-06-21 07:42:20

标签: docker go dockerfile microservices

我正在努力使用 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

1 个答案:

答案 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"]