Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable

4/16/2020

I'm trying to integrate a Whatsapp Chatbot using Cloud and I get this error when trying to deploy. I'm new to this part of coding so any help would be appreciated.

I followed this link: https://github.com/GoogleCloudPlatform/dialogflow-integrations/tree/03676af04840c21c12e2590393d5542602591bee

/**
 * Copyright 2019 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
const express = require('express');
const request = require('request');
const app = express();
const dialogflowSessionClient =
    require('../botlib/dialogflow_session_client.js');
const bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//For authenticating dialogflow_session_client.js, create a Service Account and
// download its key file. Set the environmental variable
// GOOGLE_APPLICATION_CREDENTIALS to the key file's location.
//See https://dialogflow.com/docs/reference/v2-auth-setup and
// https://cloud.google.com/dialogflow/docs/setup for details.

const projectId ='chennai-against-corona-vgomsd';
const phoneNumber ="+15404183625";
const accountSid = 'AC6c60eee5e7bbd7476d8becd46c200d50';
const authToken = '9174e1426fd6635473fb671d4f0b10f4';

const client = require('twilio')(accountSid, authToken);
const MessagingResponse = require('twilio').twiml.MessagingResponse;
const sessionClient = new dialogflowSessionClient(projectId);

const listener = app.listen(process.env.PORT, function() {
  console.log('Your Twilio integration server is listening on port '
      + listener.address().port);
});
app.post('/', async function(req, res) {
  const body = req.body;
  const text = body.Body;
  const id = body.From;
  const dialogflowResponse = (await sessionClient.detectIntent(
      text, id, body)).fulfillmentText;
  const twiml = new  MessagingResponse();
  const message = twiml.message(dialogflowResponse);
  res.send(twiml.toString());
});

process.on('SIGTERM', () => {
  listener.close(() => {
    console.log('Closing http server.');
    process.exit(0);
  });
});
-- Shaamil Karim
dialogflow
gcloud
spring-cloud-deployer-kubernetes
twilio

1 Answer

4/17/2020

The error you are encountering could be probably due to that you aren't listening for incoming HTTP requests, or you're listening for incoming requests on the wrong port.

You can see in the Official Cloud Run Documenation, your that your container must listen for incoming HTTP requests on the port that is defined by Cloud Run and provided in the $PORT environment variable.

And If your container fails to listen on the expected port, the revision health check will fail, and the revision will be in an error state blocking the traffic routed to it.

In Node.js, you can use the following code :

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

Please let me know if it solves your issue.

-- Nibrass H
Source: StackOverflow