Home > Net >  Docker image build fails: "protoc-gen-grpc-web: program not found or is not executable"
Docker image build fails: "protoc-gen-grpc-web: program not found or is not executable"

Time:11-28

i inherited a project with several microservices running on kubernetes. after copying the repo and running the steps that the previous team outlined, i have an issue building one of the images that i need to deploy. the script for the build is:

cd graph_endpoint
cp ../../Protobufs/Graph_Endpoint/graph_endpoint.proto .
protoc -I. graph_endpoint.proto --js_out=import_style=commonjs:.
protoc -I. graph_endpoint.proto --grpc-web_out=import_style=commonjs,mode=grpcwebtext:.
export NODE_OPTIONS=--openssl-legacy-provider
npx webpack ./test.js --mode development
cp ./dist/graph_endpoint.js ../public/graph_endpoint.js
cd ..

docker build . -t $1/canvas-lti-frontend:v2
docker push $1/canvas-lti-frontend:v2

i'm getting an error from line 4:

protoc-gen-grpc-web: program not found or is not executable
--grpc-web_out: protoc-gen-grpc-web: Plugin failed with status code 1.

any idea how to fix it? i have no prior experience with docker.

here's the Dockerfile:

FROM node:16


# Install app dependencies
COPY package*.json /frontend-app/
WORKDIR /frontend-app
RUN npm install
COPY server.js /frontend-app/

# Bundle app source
COPY public /frontend-app/public
COPY routes /frontend-app/routes
COPY controllers /frontend-app/controllers

WORKDIR /frontend-app
EXPOSE 3000
CMD [ "node", "server.js"]

and package.json:

{
  "name": "frontend",
  "version": "1.0.0",
  "description": "The user-facing application for the Canvas LTI Student Climate Dashboard",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@okta/oidc-middleware": "^4.3.0",
    "@okta/okta-signin-widget": "^5.14.0",
    "express": "^4.18.2",
    "express-session": "^1.17.2",
    "vue": "^2.6.14"
  },
  "devDependencies": {
    "nodemon": "^2.0.20",
    "protoc-gen-grpc-web": "^1.4.1"
  }
}

CodePudding user response:

You don't have protoc-gen-grpc-web installed on the machine on which you're running the build script.

You can download the plugins from the grpc-web repo's releases page.

protoc has a plugin mechanism.

protoc looks for its plugins in the path and expects these binaries to be prefixed protoc-gen-{foo}.

However, when you reference the plugin from protoc, you simply use {foo} and generally this is suffixed with _out and sometimes _opt, i.e. protoc ... --{foo}_out --{foo}_opt.

The plugin protoc-gen-grpc-web (once installed and accessible in the host's path) is thus referenced with protoc ... --grpc_web_out=...

  • Related