Dockerizing Node.js app时的EADDRNOTAVAIL

时间:2015-06-28 01:08:03

标签: node.js docker dockerfile

使用以下应用程序,我可以通过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;

1 个答案:

答案 0 :(得分:2)

结果robertklep在评论中我的问题是正确的:问题是试图明确地将服务器的IP传递到app.js.这就是应用程序配置为仅与Node一起工作的方式,但这不能用Docker完成。

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