Dockerizing Node.js 应用程序时 EADDRNOTAVAIL
EADDRNOTAVAIL when Dockerizing Node.js app
使用以下应用程序,我可以通过 npm install / node app.js 手动启动它。问题在于尝试通过 Docker 容器 运行 应用程序。
除了应用程序的其余部分(这无关紧要,因为 运行 宁 Docker 容器甚至没有那么远),Docker 文件从 GitHub 中提取代码,切换到该目录,然后 运行s 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.
方面我绝对没有希望
Docker文件:
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_json.app_host
。然后,运行 容器通过将暴露的端口绑定到服务器上的任何可用端口使其工作。
使用以下应用程序,我可以通过 npm install / node app.js 手动启动它。问题在于尝试通过 Docker 容器 运行 应用程序。
除了应用程序的其余部分(这无关紧要,因为 运行 宁 Docker 容器甚至没有那么远),Docker 文件从 GitHub 中提取代码,切换到该目录,然后 运行s 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.
方面我绝对没有希望Docker文件:
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_json.app_host
。然后,运行 容器通过将暴露的端口绑定到服务器上的任何可用端口使其工作。