Node.js 使用docker时连接到mongodb
我正在学习docker在我的项目中使用。然而,在使用docker时,我无法理解如何使用环境变量 这是我的mongo安装过程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
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