node.js - Docker 化 Node.js 应用程序时的 EADDRNOTAVAIL

标签 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"]

配置.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_json.app_host。然后,通过将公开的端口绑定(bind)到服务器上的任何可用端口来运行容器,使其正常工作。

关于node.js - Docker 化 Node.js 应用程序时的 EADDRNOTAVAIL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31095180/

相关文章:

javascript - 无法使用 nconf 加载配置 json 文件

docker - Kubernetes Pod重定向到另一个Pod中的相同端口

performance - 如何优化 docker 容器的性能?

python - 无法从 Docker 容器内部连接到 Redis

Docker 撰写 : How to specify path to docker file while building as if in different directory?

ubuntu - Docker:MeteorJS 安装了两次并出现一些警告

node.js - 使用 RxJs WebSocketSubject 和 Angular Universal 时出现 "ReferenceError: WebSocket is not defined"

node.js - 模块不在 npm 注册表中

javascript - 为什么setInterval不等待指定时间?

r - 使用Docker文件从源代码安装R软件包