我正在尝试使用在Docker容器中运行的node.js检索主机IP。
我正在做一些测试,并且正在使用this npm软件包。
似乎可行,但我遇到以下两个问题:
我的节点应用程序如下:
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());
}
答案 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