如何使用节点解析docker别名?

时间:2018-05-11 19:29:47

标签: node.js docker

假设您的节点应用中有两个环境: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如何在变量中存储泊坞网络别名?

3 个答案:

答案 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文件夹:

config folder

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解析。因此,大多数时候您不需要解决它们。