'Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable

I built my container image, but when I try to deploy it from the gcloud command line or the Cloud Console, I get the following error: "Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable."



Solution 1:[1]

In your code, you probably aren't listening for incoming HTTP requests, or you're listening for incoming requests on the wrong port.

As documented in the Cloud Run container runtime contract, your container must listen for incoming HTTP requests on the port that is defined by Cloud Run and provided in the $PORT environment variable.

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

For example, in Node.js with Express, you should use :

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

In Go:

port := os.Getenv("PORT")
if port == "" {
        port = "8080"
   }
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))

In python:

app.run(port=int(os.environ.get("PORT", 8080)),host='0.0.0.0',debug=True)

Solution 2:[2]

One of the other reason may be the one which I observed. Docker images may not have the required code to run the application.

I had a Node application written in TypeScript. In order to dockerize the application all I need to do is compile the code tsc and run docker build but I though that gcloud builds submit will be taking care of that and picking the compiled code as the Dockerfile suggested in conjunction to the .dockerignore and will build my source code and submit to the repository.

But what all it did was to copy my source code and submitted to the Cloud Build and there as per the Dockerfile it dockerized my source code as compared to dockerizing the compiled code.

So remember to include a build step in Dockerfile if you are doing a source code in a language with require compilation.

  • Remember that enabling the build step in the Dockerfile will increase the image size every time you do a image push to the repository. It is eating the space over there and google is going to charge you for that.

Solution 3:[3]

Another possibility is that the docker image ends with a command that takes time to complete. By the time deployment starts the server is not yet running and the health check will hit a blank.

What kind of command would that be ? Usually any command that runs the server in dev mode. For Scala/SBT it would be sbt run or in Node it would be something like npm run dev. In short make sure to run only on the packaged build.

Solution 4:[4]

The Cloud Run is generating default yaml file which has hard-coded default port in it:

spec:
  containerConcurrency: 80
  timeoutSeconds: 300
  containers:
  - image: us.gcr.io/project-test/express-image:1.0
    ports:
    - name: http1
      containerPort: 8080
    resources:
      limits:
        memory: 256Mi
        cpu: 1000m 

So, we need to expose the same 8080 port or change the containerPort in yaml file and redeploy.

Here is more about that:

Solution 5:[5]

I was exposing a PORT in dockerfile , remove that automatically fixed my problem. Google injects PORT env variable so the project will pick up that Env variable.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Pawel Wujczyk
Solution 2 Christopher Rodriguez Conde
Solution 3 inmyth
Solution 4 Lantanios
Solution 5 AKASH MATHWANI