Node.js 使用docker时连接到mongodb

Node.js 使用docker时连接到mongodb,node.js,mongodb,docker,Node.js,Mongodb,Docker,我正在学习docker在我的项目中使用。然而,在使用docker时,我无法理解如何使用环境变量 这是我的mongo安装过程 const mongoose = require('mongoose'); const Promise = require("bluebird"); const mongodb = require('mongodb'); const uuidv4 = require('uuid/v4'); const MongoClient = mongodb.MongoClient; c

我正在学习docker在我的项目中使用。然而,在使用docker时,我无法理解如何使用环境变量

这是我的mongo安装过程

const mongoose = require('mongoose');
const Promise = require("bluebird");
const mongodb = require('mongodb');
const uuidv4 = require('uuid/v4');
const MongoClient = mongodb.MongoClient;
const utilityHelper = require('../helpers/utility');

const {
  DATABASE_HOST,
  DATABASE_PORT,
  DATABASE_DBNAME,
  DATABASE_DBUSER,
  DATABASE_DBPASS
} = require('../configs');

const connectDb = () => {
  const user = encodeURIComponent(DATABASE_DBUSER);
  const password = encodeURIComponent(DATABASE_DBPASS);

  // Connection URL
  let dbUrl = `mongodb://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_DBNAME}`;
  let options={
    useNewUrlParser: true,
    useCreateIndex: true
  };
  if (user !== "undefined" && password !== "undefined") {
    options.user = user;
    options.pass = password;
    dbUrl = dbUrl + `?authSource=${DATABASE_DBNAME}`;
  } 
  return mongoose.connect(
    dbUrl,
    options,
    (err, data) => {
      if (err) {
        console.error(err.stack);
      } else {
        console.log("Database is connected..")
      }
    }
  );
};

const dbConnector = async (app) => {
  try {
    return new Promise((resolve, reject) => {
      const user = encodeURIComponent(DATABASE_DBUSER);
      const password = encodeURIComponent(DATABASE_DBPASS);

      // Connection URL
      let dbUrl="";
      if (user !== "undefined" && password !== "undefined") {
        dbUrl = `mongodb://${user}:${password}@${DATABASE_HOST}:${DATABASE_PORT}/?authSource=${DATABASE_DBNAME}`
      } else {
        dbUrl = `mongodb://${DATABASE_HOST}:${DATABASE_PORT}`;
      }
      const options = {
          promiseLibrary: Promise,
          connectTimeoutMS: 60000,
          useNewUrlParser: true,
          useUnifiedTopology: true,
      };

      const client = new MongoClient(dbUrl, options);

      client.connect(async(err, client) => {
        if(err) reject(err);
        const db = client.db(DATABASE_DBNAME);
        app.locals.db = db;
        if (process.env.RUN_FIRST_TIME === 'true') await createUsersWithRoles(db);
        console.log('database connection success');
        resolve(db);
      });
    })
  } catch(err) {
    throw new Error(err);
  }
}

const createUsersWithRoles = async(db) => {
  const adminRole = {
    _id: uuidv4(),
    name: 'Admin',
    code: 'A',
    createdAt: new Date(),
    updatedAt: new Date()
  };

  const guideRole = {
    _id: uuidv4(),
    name: 'Guide',
    code: 'G',
    createdAt: new Date(),
    updatedAt: new Date()
  };

  const user1 = {
    _id: uuidv4(),
    email: 'hello@test.com',
    firstName: "Admin",
    lastName: "Account",
    slug: 'admin-account',
    fullName: "Admin" + " " + "Account",
    password: await utilityHelper.hashPassword('Test@123'),
    gender: 'M',
    role: adminRole
  };

  await db.collection('Role').insertMany([adminRole, guideRole, travellerRole]);
  await db.collection('User').insertOne(user1);
};

module.exports = { 
  connectDb,
  dbConnector
}
环境署署长

Dockerfile

# Use a node.js image from Docker.
FROM node:12-alpine

# Create app directory, this is where our source code will live
WORKDIR /usr/src/app

RUN apk update && apk upgrade && apk add --no-cache bash git python3
# RUN apt-get install -y build-essential python
RUN npm install --global npm node-gyp

# We need to install our npm package in the container image
COPY package*.json ./

# now we will install the package
RUN npm install

# copy your application source into a src folder
COPY ./src /usr/src/app/src
COPY pm2.json ./
COPY .env ./.env

EXPOSE 8000

CMD ["npm", "start"]
docker-compose.yml

version: "3.7"

# Lets define all our services (i.e. our containers to run)
services:
    # create a mongodb database
    travel-db:
        image: mongo
        container_name: "travel-db"
        volumes:
            - mongodb:/data/db/
        # opening mongodb port so that it can be connected from host
        ports:
            - "27017:27017"
    # create redis-server
    travel-redis-server:
        image: redis:latest
        container_name: "travel-redis-server"
        volumes:
            - redis:/data/
        ports:
            - "6379:6379"

    # express app
    travel-express-server:
        image: "travel-express-server"
        container_name: "travel-express-server"
        ports:
            - "8000:8000"

volumes:
    travel-db:
    travel-redis-server:

我想知道在使用docker设置mongodb时如何利用环境变量。我需要为docker设置单独的环境变量吗?

在映像本身中设置环境变量并不是一个好的做法。而是应该这样提供:

env_file:
        - ./.env
在你的码头上。并从Dockerfile中删除相关的复制命令。 只需为docker compose中不同服务所需的所有变量保留一个.env


此外,您将无法像这样访问localhost。您需要将数据库主机更改为travel db,并对所有其他服务(如REDIS)执行相同操作。

使用环境文件时,我不需要使用环境密钥,对吗?是的,您不需要感谢您的解决方案。我无法测试它,以便在收到错误时将其标记为正确:travel express服务器的拉取访问被拒绝,存储库不存在或可能需要“docker登录”:被拒绝:请求的资源访问被拒绝错误。您只需执行docker登录,存储库可能不是公共的。因此,您将收到错误。这是一个本地nodejs存储库。
env_file:
        - ./.env