假设您的节点应用中有两个环境:local和docker。
如果您想在本地运行该应用,则可以使用
运行该应用env=local node app.js
如果你想在docker容器中运行它,你可以
env=docker node app.js
您的节点应用程序连接到简单数据库。您将数据库的名称链接到例如。 "数据库服务器&#34 ;.你怎么知道你的应用程序中的这个IP地址是什么存储在变量中? 我想象
console.log(database-server)
将返回"数据库服务器未定义"
我基本上想要一些类似的代码:
If(process.env.env === "docker") {process.env.database-ip = database-server}
Else {process.env.database-ip = localhost}
除了这个代码,数据库服务器将是未定义的。
我理解db.connect(database-server:port)通常会自动解析ip地址。但我的应用程序连接到多个文件中的数据库
搬运工-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:DR如何在变量中存储泊坞网络别名?
答案 0 :(得分:0)
我认为您需要根据环境加载配置。
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));
答案 1 :(得分:0)
由于您在其中使用了docker-compose和links
,因此您可以通过其服务名称访问任何其他服务。例如,你的数据库,你可以db.connect('mongoserver:27017')
和docker将mongoserver解析为它的实际IP。
您应该可以访问“mongoserver”&#39;在您的node.js应用程序中需要某种类型的主机名,IP地址等的任何文件中。请告诉我这是否成功。
答案 2 :(得分:0)
Docker别名通过本地dns解析。因此,大多数时候您不需要解决它们。