从Node.js中的docker获取主机IP

时间:2018-07-16 13:40:16

标签: node.js docker npm

我正在尝试使用在Docker容器中运行的node.js检索主机IP。

我正在做一些测试,并且正在使用this npm软件包。

似乎可行,但我遇到以下两个问题:

  • 我必须找到一种让函数等待响应的方法(似乎不适用于异步/等待)
  • 我不知道它是否可以使用docker swarm正常运行。

我的节点应用程序如下:

dockerhost = require(`get-docker-host`),
isInDocker = require(`is-in-docker`),

function dockerHost() {
    dockerhost(async (error, result) => {
        if (result) {
            console.log(result);
            return await result;
        } else if (error) {
            console.log(error);
            return await error;
        }
    })
}


if(isInDocker()) {
    console.log("My Docker host is " + dockerHost());
}

1 个答案:

答案 0 :(得分:1)

get-docker-host是异步的,因为它需要一个回调函数并在以后调用它,但是它不会返回Promise,因此我认为您不能使用async / await语法来调用它。您不能阻止它返回。您可以将主应用程序放在回调后面,也可以将其手动包装在Promise中。 MDN async/await documentation中有一些示例。

这是一个有效的示例,将get-docker-host的结果包装成一个诺言。如果不在Docker中,则承诺将使用null地址进行解析;如果是,并且get-docker-host成功,它将使用主机地址进行解析,如果失败,则将失败并显示相应的错误。

index.js

getDockerHost = require('get-docker-host');
isInDocker = require('is-in-docker');

checkDocker = () => {
    return new Promise((resolve, reject) => {
        if (isInDocker()) {
            getDockerHost((error, result) => {
                if (result) {
                    resolve(result);
                } else {
                    reject(error);
                }
            });
        } else {
            resolve(null);
        }
    });
};

checkDocker().then((addr) => {
    if (addr) {
        console.log('Docker host is ' + addr);
    } else {
        console.log('Not in Docker');
    }
}).catch((error) => {
    console.log('Could not find Docker host: ' + error);
});

Dockerfile

FROM node:10
COPY package.json yarn.lock ./
RUN yarn install
COPY index.js ./
CMD ["node", "./index.js"]

运行它:

% node index.js
Not in Docker
% docker build .
Sending build context to Docker daemon   21.5kB
...
Successfully built e14d41aa0c9b
% docker run --rm e14d41aa0c9b
Docker host is 172.17.0.1