在Dockerizing Node.js应用程序时EADDRNOTAVAIL

在Dockerizing Node.js应用程序时EADDRNOTAVAIL,node.js,docker,dockerfile,Node.js,Docker,Dockerfile,使用以下应用程序,我可以通过npm install/node app.js手动启动它。问题在于试图通过Docker容器运行应用程序 除了应用程序的其余部分(这并不重要,因为运行Docker容器根本就没有那么远),Dockerfile从GitHub提取代码,切换到该目录,然后运行app.js(从config.json文件提取主机和端口)。尝试使用服务器的IP地址(它应该侦听的内容)运行容器会导致以下错误: uncaughtException: Error: listen EADDRNOTAVAIL

使用以下应用程序,我可以通过npm install/node app.js手动启动它。问题在于试图通过Docker容器运行应用程序

除了应用程序的其余部分(这并不重要,因为运行Docker容器根本就没有那么远),Dockerfile从GitHub提取代码,切换到该目录,然后运行app.js(从config.json文件提取主机和端口)。尝试使用服务器的IP地址(它应该侦听的内容)运行容器会导致以下错误:

uncaughtException: Error: listen EADDRNOTAVAIL
Error: listen EADDRNOTAVAIL
at errnoException (net.js:905:11)
at Server._listen2 (net.js:1024:19)
at listen (net.js:1065:10)
at net.js:1147:9
at dns.js:72:18
at process._tickCallback (node.js:442:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)
at node.js:929:3
更改端口无助于解决问题。我已经包括了下面的相关文件(某些部分替换为{pseudocode})。任何帮助都将不胜感激,因为我对Docker毫无希望

Dockerfile:

FROM    centos:centos6
RUN     rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
RUN     yum install -y npm git
RUN git clone {repo.git}
COPY . /src
RUN npm install
CMD ["node", "app.js"]
config.json:

{
    "app_host": "{IP of server}",
    "app_port": "20000"
}
app.js:

var server = app.listen(config_json.app_port, config_json.app_host, function () {

  var host = server.address().address;
  var port = server.address().port;

  console.log('\n  listening at http://%s:%s', host, port);

});

module.exports = app;

事实证明,robertklep在对我的问题的评论中是正确的:问题是试图显式地将服务器的IP传递到app.js。这就是将应用程序配置为只在Node中运行的方式,但Docker无法做到这一点


唯一需要更改的代码是从app.js中的
app.listen
中删除
config\u json.app\u host
。然后,通过将公开的端口绑定到服务器上的任何可用端口来运行容器会使其工作。

您是否尝试在对app.listen的调用中对端口和IP地址进行硬编码,以查看读取配置是否有问题?如果能够读取配置,日志输出的其余部分将说明config.json中的变量(包括我移除的那些).而且,如果我以0.0.0.0的形式传递IP,它会说监听0.0.0:20000。我也尝试过对其进行硬编码,只是想看看它是否可以修复,但不幸的是,它遇到了相同的错误。
app_host
设置为什么?它是Docker容器中有效的IP地址吗?我相信Docker使用了私有IP范围因为它的接口,所以你不能直接绑定到“外部”IP号。你使用什么命令来运行容器?@robertklep它被设置为服务器的私有IP。就像我说的,我对Docker没用,所以我不知道我不能这样做。