【问题标题】:How to use docker to generate grpc code based on go.mod versions?如何使用docker生成基于go.mod版本的grpc代码?
【发布时间】:2021-02-25 14:58:46
【问题描述】:

使用官方的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尝试)。像这样的:

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,怎么找不到呢?

【问题讨论】:

  • 您是否尝试按照文档here 中的说明在Dockerfile 中执行命令go install google.golang.org/protobuf/cmd/protoc-gen-go

标签: docker go protocol-buffers grpc protoc


【解决方案1】:

go.mod & go.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 - 或删除 @ 后缀

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 2022-01-21
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多