node.js - 谷歌云上的 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并运行命令,但在生产中,这个过程是自动化的。
请任何帮助解决这些问题,在此先感谢!
解决方案
推荐阅读
- javascript - CryptoJS 解码返回值
- google-apps-script - Google 表单 - 采用(长)现有表单并使用脚本添加基于答案的页面导航
- java - 找不到主类
- java - 如何通过两个键使用 Jolt 聚合 JSON 数据?
- feathersjs - FeathersJS - 确保只有注册的用户才能获得“用户创建”
- python - 使用非 Qt 从 Qt QJsonDocument::toBinaryData 读取二进制 Json?
- python - Spark 作业与 0 个执行者一起挂起
- java - 从 Guice 模块定义中获取调用者的名称或引用
- javascript - 随机图像游戏停止重复
- c - 向死服务器发送 UDP 数据包