Home > Back-end >  Cloud Run: The user-provided container failed to start and listen on the port defined provided by th
Cloud Run: The user-provided container failed to start and listen on the port defined provided by th

Time:01-26

I am trying to deploy a containerized node-typescript-express app to cloud run but I am unable to do so, receiving the following error:

The user-provided container failed to start and listen on the port defined provided by the PORT=8080

Here is my Dockerfile config:

FROM node:18.13.0 as base

WORKDIR /home/node/app

COPY package*.json ./

RUN npm i

COPY . .

FROM base as production

ENV NODE_PATH=./dist

RUN npm run build

In my code, I'm declaring port as

const PORT = process.env.PORT || 8080;

I also have a .env file where I was setting port, but I deleted the port key - as far as I know, GCP cloud run injects the port variable anyway.

Here is a screenshot from my project settings on GCP. I uploaded my image by building it locally with docker-compose build, tagging it, and uploading it to the GCP container repository.

enter image description here

I've tried manually setting the port in the code, removing the env file completely, specifying a different port, etc. I'm not even sure if the port is specifically the error and it's just some kind of catch-all.

Here's my package.json:

{
  "name": "weather-service",
  "version": "0.0.0",
  "description": "small node server that fetches openweather api data",
  "engines": {
    "node": ">= 18.12 <19"
  },
  "scripts": {
    "start": "NODE_PATH=./dist node dist/src/index.js",
    "clean": "rimraf coverage dist tmp",
    "dev": "ts-node-dev -r tsconfig-paths/register src/index.ts",
    "prebuild": "npm run lint",
    "build": "ttsc -p tsconfig.release.json",
    "build:watch": "ttsc -w -p tsconfig.release.json",
    "build:release": "npm run clean && ttsc -p tsconfig.release.json",
    "test": "jest --coverage --detectOpenHandles --forceExit",
    "test:watch": "jest --watch --detectOpenHandles --forceExit",
    "lint": "eslint . --ext .ts --ext .mts && tsc",
    "lint:fix": "eslint . --ext .ts --ext .mts",
    "prettier": "prettier --config .prettierrc --write .",
    "prepare": "husky install",
    "pre-commit": "lint-staged"

And lastly, here's my docker-compose file and how I'm executing the commands

docker-compose.yml

version: '3.7'

services:
  weather-service:
    build:
      context: .
      dockerfile: Dockerfile
      target: base
    volumes:
      - ./src:/home/node/app/src
    container_name: weather-service
    expose:
      - '8080'
    ports:
      - '8080:8080'
    command: npm run dev

docker-compose.prod.yml

version: '3.7'

services:
  weather-service:
    build:
      target: production
    command: npm run start

docker.compose.dev.yml

version: '3.7'

services:
  weather-service:
    env_file:
      - .env
    environment:
      - ${PORT}
      - ${WEATHER_API_KEY}

Makefile

up:
    docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

up-prod:
    docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

down: 
    docker-compose down

build:
    docker-compose build

CodePudding user response:

If you are using Macbook, then below answer from Bk Lim in the below link might help you:

Cloud Run: "Failed to start and then listen on the port defined by the PORT environment variable." When I use 8080

CodePudding user response:

Update: I managed to get it successfully deployed by changing my docker-compose files to a template I found on GitHub, here

My docker knowledge is minimal so if anyone has any idea why my old docker-compose wasn't working, I'd love to know.

  • Related