最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用docker时连接到mongodb

网站源码admin21浏览0评论

使用docker时连接到mongodb

使用docker时连接到mongodb

我正在学习用于项目的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: '[email protected]',
    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
}

。env

DATABASE_HOST=localhost
DATABASE_PORT=27017
DATABASE_DBUSER=travel
DATABASE_DBPASS=travel123
DATABASE_DBNAME=travel_db

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变量吗?

回答如下:

将env变量包含在图像本身中并不是一个好习惯。它应该这样提供:

env_file:
        - ./.env

在您的docker-compose中。并从Dockerfile中删除相关的COPY命令。对于docker-compose中的不同服务所需的所有变量,只需保留一个.env即可。

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

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论