假设您的节点应用程序中有两个环境:本地环境和停靠环境。
如果您想在本地运行该应用程序,您将使用
env=local node app.js
如果您想在码头集装箱中运行它,您可以这样做。
env=docker node app.js
节点应用程序连接到一个简单的数据库。你把数据库的名字和某件事联系起来。“数据库服务器”。如何计算应用程序中的ip地址,以便将其存储在变量中?我想
console.log(database-server)
将返回“数据库服务器未定义”。
我基本上想要一些代码,类似于:
If(process.env.env === "docker") {process.env.database-ip = database-server}
Else {process.env.database-ip = localhost}
除非使用此代码,否则数据库服务器将未定义。
我知道db.connect(数据库服务器:端口)通常会自动解析ip地址。但是我的应用程序在多个文件中连接到数据库。
docker-compose.yml
version: '3'
services:
myapp:
build: .
container_name: "myapp"
links:
- mongoserver
- ipfs
depends_on:
- mongoserver
- ipfs
environment:
- ENV=docker-dev
mongoserver:
image: 'mongo:3.7.9'
container_name: "mongodb"
ports:
- '27017:27017'
volumes:
- 'data-volume:/data/db'
ipfs:
image: 'jbenet/go-ipfs:latest'
container_name: "ipfs"
ports:
- "5001:5001"
- "4001:4001"
- "8080:8080"
volumes:
data-volume:
根目录中的Dockerfile
FROM node
RUN mkdir -p /usr/src/app
ADD server.js /usr/src/app
ADD package.json /usr/src/app
WORKDIR /usr/src/app
# install the dependencies from the package.json file
RUN npm install
EXPOSE 9000
CMD [ "node", "/usr/src/app/server.js" ]
TL:博士,您如何在变量中存储码头网络别名?
发布于 2018-05-29 14:54:53
码头别名通过本地dns解析。因此,大多数情况下,您不需要解决这些问题。
发布于 2018-05-11 19:47:05
我认为您需要根据环境加载配置。
1) Dockerfile:
FROM node:8-alpine
ARG EXPOSE=5005
ENV PORT $EXPOSE
ENV EXPOSE_PORT $EXPOSE
EXPOSE $EXPOSE_PORT
RUN apk add --no-cache curl
ADD ./ /app
WORKDIR /app
RUN npm i
CMD ["npm", "start"]
2)在package.json文件中启动脚本:
"start": "NODE_ENV=production node server.js",
"development": "NODE_ENV=development node server.js",
3)具有多个环境信任的config文件夹:
4) index.js
,用于检测NODE_ENV
并加载必要的json并替换PORT
(参见最后一行)等外部变量:
'use strict';
const nconf = require('nconf');
const path = require('path');
const fs = require('fs');
nconf.env().argv();
const environments = [
'development',
'production',
'local',
'test'
];
if (!nconf.get('NODE_ENV')) {
throw new Error('NODE_ENV parameter not defined! \nPlease consider to use one of these environments: ' + environments.join(', '));
}
if (environments.indexOf(nconf.get('NODE_ENV')) < 0) {
throw new Error('NODE_ENV parameter is not valid! \nPlease consider to use one of these environments: ' + environments.join(', '));
}
try {
const envConfigFileName = 'config.' + nconf.get('NODE_ENV') + '.json';
const configFile = path.join(__dirname, envConfigFileName);
const hiddenConfigFile = path.join(__dirname, '.' + envConfigFileName);
let currentConfigFile = configFile;
if (!fs.existsSync(configFile)) {
if (!fs.existsSync(hiddenConfigFile)) {
throw new Error('Cannot locate ' + nconf.get('NODE_ENV') + ' environment configuration file');
}
currentConfigFile = hiddenConfigFile;
console.log('\n\n');
console.log('WARNING READING HIDDEN (dot-file) CONFIG FILE: ' + hiddenConfigFile);
console.log('MAKE SURE TO HAVE LOCAL COPY OF IT WITHOUT dot (.) SYMBOL AS PREFIX IN FILE NAME');
console.log('\n\n');
}
nconf.file(currentConfigFile);
} catch (exception) {
throw new Error(exception);
}
if (process.env.PORT) nconf.set('app:http:port', process.env.PORT);
if (process.env.HOST) nconf.set('app:http:host', process.env.HOST);
if (process.env.HTTPS_PORT) nconf.set('app:https:port', process.env.HTTPS_PORT);
if (process.env.HTTPS_HOST) nconf.set('app:https:host', process.env.HTTPS_HOST);
process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
// if(nconf.get('NODE_ENV') !== 'production') process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
module.exports = nconf;
5)配置模块在app.js
中的示例用法:
const config = require('./config');
consd db = require('./database');
db.connect(config.get('db:uri'));
const express = require('express');
const app = express();
app.get('/', (req, res) => res.status(204).send());
const listenHost = config.get('app:http:host');
const listenPort = config.get('app:http:port');
const httpServer = http.createServer(app);
httpServer.listen(listenPort, listenHost,
() => logger.info('App listening at http://%s:%s', listenHost, listenPort));
发布于 2018-05-14 15:57:40
由于您在其中使用的是docker和links
,所以您可以通过它们的服务名称访问任何其他服务。例如,您的数据库,您可以做db.connect('mongoserver:27017')
和码头将解析为它的实际IP。
您应该能够访问您的任何文件中的“mongoserver”,在这些文件中,node.js应用程序中需要某种类型的主机名、IP地址等。如果这件事成功了,请告诉我。
https://stackoverflow.com/questions/50299051
复制相似问题