首页 > 解决方案 > 谷歌云上的 NodeJs Docker 部署运行

问题描述

我试图在过去两天运行的谷歌云上部署我的 NodeJs 应用程序。我使用 cloudbuild.ymal,所有的构建过程和部署过程都没有错误地完成。但我不知何故无法在部署后打开应用程序。

在此处输入图像描述 在我从 errorHandler 中间件收到错误之前,但是在我设置 NODE_ENV = production 之后它就消失了。我仍然收到此错误 在此处输入图像描述

该应用程序在我使用 Docker 和 MongoDB 的本地机器上运行良好,没有错误。这是我的 cloudbuild.yaml

steps:
- name: 'docker/compose:1.19.0'
  args: ['up', '-d']
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/ecommerce:latest', '-t', 'gcr.io/$PROJECT_ID/ecommerce:$COMMIT_SHA', '-t', 'gcr.io/$PROJECT_ID/ecommerce:$BUILD_ID', '.']
  id: 'build-image-ecommerce'
  timeout: 500s
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/ecommerce:$COMMIT_SHA']
  id: 'push-image-to-container-registry'
  waitFor: ['build-image-ecommerce']
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - 'run'
  - 'deploy'
  - 'ecommerce'
  - '--image'
  - 'gcr.io/$PROJECT_ID/ecommerce:$COMMIT_SHA'
  - '--region'
  - 'us-east4'
  - '--platform'
  - 'managed'
  - '--allow-unauthenticated'
  waitFor: ['push-image-to-container-registry']
  id: 'deploy-to-cloud-run'
images:
- 'gcr.io/$PROJECT_ID/ecommerce:latest'
- 'gcr.io/$PROJECT_ID/ecommerce:$COMMIT_SHA'
- 'gcr.io/$PROJECT_ID/ecommerce:$BUILD_ID'  

这是我的 server.js

const express = require('express')
const dotenv = require('dotenv')
const morgan = require('morgan')
const colors = require('colors')
const connectDB = require('./config/db')
const authRoute = require('./Routes/authRoute')
const productRoute = require('./Routes/productRoute')
const orderRoute = require('./Routes/orderRoute')

const { errorHandler, notFound } = require('./Middlewares/errorMiddleware')


// DB Connection 
connectDB()

dotenv.config()

const app = express()

if (process.env.NODE_ENV === 'development') {
    app.use(morgan('dev'))
}
app.use(express.json())

//Routes
app.use('/api/users', authRoute)
app.use('/api/products', productRoute)
app.use('/api/orders', orderRoute)


// Error Middlewares
app.use(errorHandler)
app.use(notFound)


const PORT = process.env.PORT || 5000 


app.listen(PORT, console.log(`App is running in ${process.env.NODE_ENV} on port ${PORT}`.blue.underline))

这是我的 docker-compose.yml 非常简单的设置

version: '3'
services:
  app: 
    container_name: ecommerceApi
    restart: always
    build: .
    ports:
      - '80:5000'
    links: 
      - mongodb
  mongodb:
    container_name: mongodb
    image: mongo
    ports:
      - '27017:27017'
    environment: 
      - MONGO_INITDB_ROOT_USERNAME=admin 
      - MONGO_INITDB_ROOT_PASSWORD=password   

这是 Dockerfile

FROM node:14

WORKDIR /usr/src/app

COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

COPY . ./

EXPOSE 5000

CMD ["npm", "start"]

我使用 MongoDB 作为数据库,我也有另一个。如何在使用 Docker 时将一些数据迁移到数据库,即运行命令,如 npm run data:import 以在数据库中导入数据。我尝试了一些方法,但我没有为我工作。我可以执行docker exec -it sh并运行命令,但在生产中,这个过程是自动化的。

请任何帮助解决这些问题,在此先感谢!

标签: node.jsmongodbdockergoogle-cloud-platformgoogle-cloud-run

解决方案


推荐阅读