如何使用docker生成基于go.mod版本的grpc代码?
How to use docker to generate grpc code based on go.mod versions?
使用官方golang
docker镜像,我可以使用protoc
命令生成x.pb.go
和x_grpc.pb.go
文件。问题是它使用最新版本,而我想使用属于 go.mod
文件的任何版本生成那些版本。
我尝试从 golang
图像开始,然后获取我项目的 go.mod
文件,获取依赖项并尝试从那里生成。这是我的 docker 文件:
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
,怎么找不到?
go.mod
& go.sum
用于在构建 go
程序时进行版本控制。这不是你在这里需要的。您希望 protoc
编译器在 运行 针对您的 .proto
文件时使用正确的插件版本。
要安装所需的 protoc-gen-go
(如果使用 gRPC,则 protoc-gen-go-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
- 或删除 @
后缀
使用官方golang
docker镜像,我可以使用protoc
命令生成x.pb.go
和x_grpc.pb.go
文件。问题是它使用最新版本,而我想使用属于 go.mod
文件的任何版本生成那些版本。
我尝试从 golang
图像开始,然后获取我项目的 go.mod
文件,获取依赖项并尝试从那里生成。这是我的 docker 文件:
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
,怎么找不到?
go.mod
& go.sum
用于在构建 go
程序时进行版本控制。这不是你在这里需要的。您希望 protoc
编译器在 运行 针对您的 .proto
文件时使用正确的插件版本。
要安装所需的 protoc-gen-go
(如果使用 gRPC,则 protoc-gen-go-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
- 或删除 @
后缀