首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用节点解析码头别名?

如何使用节点解析码头别名?
EN

Stack Overflow用户
提问于 2018-05-11 19:29:47
回答 3查看 1.4K关注 0票数 1

假设您的节点应用程序中有两个环境:本地环境和停靠环境。

如果您想在本地运行该应用程序,您将使用

代码语言:javascript
运行
复制
env=local node app.js

如果您想在码头集装箱中运行它,您可以这样做。

代码语言:javascript
运行
复制
env=docker node app.js

节点应用程序连接到一个简单的数据库。你把数据库的名字和某件事联系起来。“数据库服务器”。如何计算应用程序中的ip地址,以便将其存储在变量中?我想

代码语言:javascript
运行
复制
console.log(database-server) 

将返回“数据库服务器未定义”。

我基本上想要一些代码,类似于:

代码语言:javascript
运行
复制
If(process.env.env === "docker") {process.env.database-ip = database-server} 
Else {process.env.database-ip = localhost}

除非使用此代码,否则数据库服务器将未定义。

我知道db.connect(数据库服务器:端口)通常会自动解析ip地址。但是我的应用程序在多个文件中连接到数据库。

docker-compose.yml

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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:博士,您如何在变量中存储码头网络别名?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-29 14:54:53

码头别名通过本地dns解析。因此,大多数情况下,您不需要解决这些问题。

票数 0
EN

Stack Overflow用户

发布于 2018-05-11 19:47:05

我认为您需要根据环境加载配置。

1) Dockerfile:

代码语言:javascript
运行
复制
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文件中启动脚本:

代码语言:javascript
运行
复制
"start": "NODE_ENV=production node server.js",
"development": "NODE_ENV=development node server.js",

3)具有多个环境信任的config文件夹:

4) index.js,用于检测NODE_ENV并加载必要的json并替换PORT (参见最后一行)等外部变量:

代码语言:javascript
运行
复制
'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中的示例用法:

代码语言:javascript
运行
复制
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));
票数 0
EN

Stack Overflow用户

发布于 2018-05-14 15:57:40

由于您在其中使用的是docker和links,所以您可以通过它们的服务名称访问任何其他服务。例如,您的数据库,您可以做db.connect('mongoserver:27017')和码头将解析为它的实际IP。

您应该能够访问您的任何文件中的“mongoserver”,在这些文件中,node.js应用程序中需要某种类型的主机名、IP地址等。如果这件事成功了,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50299051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档