node.js - Cloud Run:用户提供的容器未能启动并监听由 PORT=8080 提供的端口
我正在尝试将一个容器化的 node-typescript-express 应用部署到 Cloud Run,但无法成功,收到以下错误:
The user-provided container failed to start and listen on the port defined provided by the PORT=8080这是我的 Dockerfile 配置:
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
在我的代码中,我正在声明端口为
const PORT = process.env.PORT || 8080;
我还有一个 .env 文件,我在里面设置了端口,但我删除了端口键——据我所知,GCP Cloud Run 还是会注入端口变量。
这是我在 GCP 上的项目设置截图。我通过在本地使用 docker-compose build 构建镜像、打标签,然后上传到 GCP 容器仓库来上传我的镜像。
我已经尝试过在代码中手动设置端口,完全删除环境文件,指定不同的端口等等。我甚至不确定是否端口确实是错误的原因,可能只是某种通用的错误提示。
这是我的 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"
最后,这是我的 docker-compose 文件以及我如何执行命令
docker-compose.ymlversion: '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.ymlversion: '3.7'
services:
weather-service:
build:
target: production
command: npm run start
docker.compose.dev.ymlversion: '3.7'
services:
weather-service:
env_file:
- .env
environment:
- ${PORT}
- ${WEATHER_API_KEY}
Makefileup:
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
答案#1
更新:我成功部署了它,通过将我的 docker-compose 文件更改为我在 GitHub 上找到的模板,在这里
我的 Docker 知识非常有限,所以如果有人知道为什么我以前的 docker-compose 不能工作,我很想知道。
