如何使用docker根据go.mod版本生成grpc代码?

问题描述

使用官方 golang docker 镜像,我可以使用 protoc 命令生成 x.pb.gox_grpc.pb.go 文件。问题是它使用最新版本,而我想使用 go.mod 文件中的任何版本生成那些版本。

我尝试从 golang 映像开始,然后获取我项目的 go.mod 文件获取依赖项并尝试从那里生成。这是我的 dockerfile:

FROM golang:1.15

workdir /app

RUN apt-get update
RUN apt install -y protobuf-compiler

copY go.* .
RUN go mod download
RUN go get all

RUN export PATH="$PATH:$(go env GOPATH)/bin"

RUN mkdir /api

然后我尝试绑定 .proto 文件的卷和 /pb 文件夹来输出它们,并再次使用 protoc 命令(我直接从 docker right 尝试现在)。像这样:

protoc --proto_path=/api --go_out=/pb --go-grpc_out=/pb /api/x.proto

虽然我收到此错误

protoc-gen-go: program not found or is not executable
--go_out: protoc-gen-go: Plugin Failed with status code 1.

我的 go.sum 文件中有 google.golang.org/protobuf v1.25.0,为什么找不到?

解决方法

go.modgo.sum 用于构建 go 程序时的版本控制。这不是您在这里需要的。您希望 protoc 编译器在针对您的 .proto 文件运行时使用正确的插件版本。

要安装所需的 protoc-gen-go(和 protoc-gen-go-grpc,如果使用 gRPC)插件,请直接安装它们。像这样更新您的 Dockerfile

FROM golang:1.15

WORKDIR /app

RUN apt-get update
RUN apt install -y protobuf-compiler

RUN GO111MODULE=on \
        go get google.golang.org/protobuf/cmd/protoc-gen-go@v1.25.0 \
        google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0

# export is redundant here `/go/bin` is already in `golang` image's path
# (and actual any env change here is lost once the command completes)
# RUN export PATH="$PATH:$(go env GOPATH)/bin"

RUN mkdir /api

如果您想要任一插件的最新版本,请使用 @latest - 或删除 @ 后缀

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...