undefined: grpc.SupportPackageIsVersion7 grpc.ServiceRegistrar
Asked Answered
K

7

16

Inside docker, it seems that I cannot compile my gRPC micro-service due to this error:

Step 4/9 : RUN make build
 ---> Running in ceb6e4d0e19b
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto

plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go://  protoc-gen-go v1.25.0-devel
./pkg/proto/notify/notify.pb.go://  protoc        v3.12.4

go build -o notify-service *.go
go: downloading github.com/lib/pq v1.7.0
go: downloading google.golang.org/grpc v1.27.0
go: downloading github.com/jinzhu/gorm v1.9.14
go: downloading github.com/aws/aws-sdk-go v1.33.7
go: downloading github.com/go-kit/kit v0.10.0
go: downloading google.golang.org/protobuf v1.25.0
go: downloading github.com/go-co-op/gocron v0.2.1
go: downloading github.com/sirupsen/logrus v1.6.0
go: downloading github.com/golang/protobuf v1.4.2
go: downloading github.com/matcornic/hermes/v2 v2.1.0
go: downloading github.com/jhillyerd/enmime v0.8.1
go: downloading golang.org/x/sys v0.0.0-20200523222454-059865788121
go: downloading github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43
go: downloading github.com/vanng822/go-premailer v0.0.0-20191214114701-be27abe028fe
go: downloading github.com/imdario/mergo v0.3.9
go: downloading github.com/russross/blackfriday/v2 v2.0.1
go: downloading github.com/jinzhu/inflection v1.0.0
go: downloading github.com/Masterminds/sprig v2.16.0+incompatible
go: downloading golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2
go: downloading github.com/PuerkitoBio/goquery v1.5.1
go: downloading github.com/pkg/errors v0.9.1
go: downloading golang.org/x/text v0.3.2
go: downloading github.com/vanng822/css v0.0.0-20190504095207-a21e860bcd04
go: downloading github.com/shurcooL/sanitized_anchor_name v1.0.0
go: downloading github.com/aokoli/goutils v1.0.1
go: downloading google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013
go: downloading gopkg.in/gormigrate.v1 v1.6.0
go: downloading github.com/gorilla/css v1.0.0
go: downloading github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf
go: downloading github.com/andybalholm/cascadia v1.1.0
go: downloading github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561
go: downloading golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37
go: downloading github.com/olekukonko/tablewriter v0.0.1
go: downloading github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a
go: downloading github.com/huandu/xstrings v1.2.0
go: downloading github.com/Masterminds/semver v1.4.2
go: downloading github.com/google/uuid v1.1.1
go: downloading github.com/mattn/go-runewidth v0.0.4
go: downloading github.com/go-logfmt/logfmt v0.5.0
go: downloading github.com/jmespath/go-jmespath v0.3.0
# gitlab.com/kuecr/fero/backend/notify/pkg/proto/notify
pkg/proto/notify/notify_grpc.pb.go:14:11: undefined: grpc.SupportPackageIsVersion7
pkg/proto/notify/notify_grpc.pb.go:71:30: undefined: grpc.ServiceRegistrar
make: *** [Makefile:14: build] Error 2
ERROR: Service 'notify' failed to build: The command '/bin/sh -c make build' returned a non-zero code: 2
make: *** [Makefile:64: build/notify] Error 1

However, outside of Docker the thing is run and compile with success.

This is my base Docker image:

RG go_version

FROM golang:${go_version}-buster

ARG pb_version

RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*

RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
        unzip protobuf-cpp-${pb_version}.zip && \
        cd protobuf-${pb_version} && \
        ./configure  && \
        make  && \
        make check  && \
        make install  && \
        ldconfig && \
        cd ../ && \
        rm -rf protobuf-*

RUN go get github.com/githubnemo/CompileDaemon && \
        go get github.com/golang/protobuf/protoc-gen-go && \
        go get github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc && \
        go install github.com/golang/protobuf/protoc-gen-go && \
        go install github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc

This is the Docker image where the compilation is done:

FROM registry.gitlab.com/kuecr/devops/go-protobuf-base:1.14 as base

WORKDIR /app

COPY . .

RUN make build

FROM base as testing

ENTRYPOINT ["make", "test"]

FROM base as production

RUN make build

ENTRYPOINT CompileDaemon -log-prefix=false -build="go build -o notify-service" -command="./notify-service"

My docker and docker-compose and protoc versions:

✖ docker --version && docker-compose --version
Docker version 19.03.12-ce, build 48a66213fe
docker-compose version 1.26.2, build unknown
➜ protoc --version
libprotoc 3.12.4

This is what happens when I ran make build on my machine:

➜ make build
protoc --version
libprotoc 3.12.4
protoc --proto_path=pkg/proto/notify/ --go_out=pkg/proto/notify/ --go-grpc_out=pkg/proto/notify/ --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative notify.proto

plugin versions reported in *.pb.go files:
./pkg/proto/notify/notify.pb.go://  protoc-gen-go v1.25.0
./pkg/proto/notify/notify.pb.go://  protoc        v3.12.4

go build -o notify-service *.go

I'm using Golang 1.15 while the Docker image use 1.14.

Keratoid answered 30/8, 2020 at 22:39 Comment(0)
R
7

The gist of this error is that the version of binary used to generate the code isn't compatible with the current version of code. A quick and easy solution would be to try updating the protoc-gen-go compiler and the gRPC library to the latest version.

go get -u github.com/golang/protobuf/protoc-gen-go

then regen the proto

heres a link to a reddit thread that discusses the issue

Replevy answered 31/8, 2020 at 3:17 Comment(0)
D
25

Already they have provided this solution in their documentation here. I had the same issue and here is my solution:

go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto

Here is the explanation if you are not using Go modules:

Denney answered 7/9, 2020 at 10:20 Comment(0)
R
7

The gist of this error is that the version of binary used to generate the code isn't compatible with the current version of code. A quick and easy solution would be to try updating the protoc-gen-go compiler and the gRPC library to the latest version.

go get -u github.com/golang/protobuf/protoc-gen-go

then regen the proto

heres a link to a reddit thread that discusses the issue

Replevy answered 31/8, 2020 at 3:17 Comment(0)
P
6

grpc.SupportPackageIsVersion is used to track the version of the protobuf generated code and is different from the grpc release version.

In short, Your generated GRPC code structure is newer than your google.golang.org/grpc package. So you must update your go grpc package to the new one.

SupportPackageIsVersion7 support after 1.32.0 versions. and they support old versions with go version >= 1.12

to update it you should

  • first, remove the current one, to find where it stored, you can use the echo $PATH command to find out where this file is. then remove it.

  • second, install the new one, for installing it you can run this command.

    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc

    Note If you have any problem to get it, use this command instead,

    go get -u github.com/golang/protobuf/protoc-gen-go

after the update, you must edit your go.mod file.

change this line:

google.golang.org/grpc v1.21.1

to

google.golang.org/grpc v1.32.0// or newer

Note: You can find last releases from this URL

You can find versions supports of the package at the end of rpc_util.go in constants.

something like this:

const (
    SupportPackageIsVersion3 = true
    SupportPackageIsVersion4 = true
    SupportPackageIsVersion5 = true
    SupportPackageIsVersion6 = true
    SupportPackageIsVersion7 = true
)
Protolithic answered 18/11, 2020 at 9:41 Comment(0)
R
3

I solved this problem by specifying grpc-go version to v1.33.0-dev, but this version is not included in ver v1.31.1.

Rage answered 31/8, 2020 at 3:22 Comment(4)
you mean setting a version for github.com/grpc/grpc-go/cmd/protoc-gen-go-grpc?Keratoid
nope, set version for google.golang.org/grpc, like this: google.golang.org/grpc v1.33.0-dev (one line in go.mod)Rage
is it fine using version which is not official ?Bushnell
@MeiLie It is a dev version but not not official. Also I have just checked the latest (grpc-go-1.34.0)[github.com/grpc/grpc-go/releases/tag/v1.34.0] version and found the SupportPackageIsVersion7 has been added.Rage
B
3

Even with go get -u my version for some reason didn't get updated to the last one. I had to update google.golang.org/grpc v1.27.0 to google.golang.org/grpc v1.34.0 (latest version attow) in my go.mod manually. Then it worked.

Bennie answered 22/12, 2020 at 7:25 Comment(1)
work with latest versionPole
K
1

Complementary to @Jay Lane answer, I want to share the Dockerfile configuration I put together:

ARG go_version

FROM golang:${go_version}-buster

ARG pb_version
ARG grpc_version
ARG gen_version
ARG compile_daemon_version
ARG dlv_version

RUN apt-get update && apt-get install -y build-essential curl git wget unzip && rm -rf /var/lib/apt/lists/*

RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v${pb_version}/protobuf-cpp-${pb_version}.zip && \
        unzip protobuf-cpp-${pb_version}.zip && \
        cd protobuf-${pb_version} && \
        ./configure  && \
        make  && \
        make check  && \
        make install  && \
        ldconfig && \
        cd ../ && \
        rm -rf protobuf-*

WORKDIR /tmp

RUN GO111MODULE=on go get google.golang.org/protobuf/cmd/protoc-gen-go@v${gen_version} && \
        GO111MODULE=on go get google.golang.org/grpc@v${grpc_version} && \
        GO111MODULE=on go get github.com/githubnemo/CompileDaemon@v${compile_daemon_version} && \
        GO111MODULE=on go get github.com/go-delve/delve/cmd/dlv@v${dlv_version}


RUN git clone https://github.com/grpc/grpc-go.git && \
        cd grpc-go/cmd/protoc-gen-go-grpc && \
        git checkout v${grpc_version} && go install . && \
        cd /tmp && rm -rf grpc-go

WORKDIR /go

and I also updated google.golang.org/grpc to v1.31.1.

EDIT:

This is the Makefile I use to help me build this image, is included for the sake of completeness:

GO_VERSION=1.14
PROTOBUF_VERSION=3.12.4
GEN_VERSION=1.25.0
GRPC_VERSION=1.31.1
COMPILE_DAEMON_VERSION=1.2.1
DLV_VERSION=1.5.0

push: build
    docker push registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)

build:
    docker build \
        --build-arg pb_version=$(PROTOBUF_VERSION) \
        --build-arg go_version=$(GO_VERSION) \
        --build-arg gen_version=$(GEN_VERSION) \
        --build-arg grpc_version=$(GRPC_VERSION) \
        --build-arg compile_daemon_version=$(COMPILE_DAEMON_VERSION) \
        --build-arg dlv_version=$(DLV_VERSION) \
    -t registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION) .

history:
    docker image history registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)

sh:
    docker run --rm --interactive --tty --entrypoint /bin/sh registry.gitlab.com/kuecr/devops/go-protobuf-base:$(GO_VERSION)
Keratoid answered 31/8, 2020 at 6:39 Comment(0)
P
0

Similar errors.

undefined: grpc.SupportPackageIsVersion8
undefined: grpc.StaticMethod

Upgrade grpc related dependencies can solve the problem.

go get -u github.com/grpc-ecosystem/grpc-gateway/v2
go get -u google.golang.org/grpc
go get -u google.golang.org/protobuf

Peplos answered 5/6, 2024 at 14:22 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.