EADDRNOTAVAIL при докеризации приложения Node.js

Со следующим приложением я могу запустить его вручную через 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

Изменение порта никак не решает проблему. Я включил соответствующие файлы ниже (некоторые разделы заменены на {псевдокод}). Любая помощь будет безмерно оценена, потому что я абсолютно безнадежен, когда дело доходит до 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"]

конфиг.json:

{
    "app_host": "{IP of server}",
    "app_port": "20000"
}

приложение.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;

person Jack Hilary    schedule 28.06.2015    source источник
comment
Вы пытались жестко закодировать порт и IP-адрес в вызове app.listen, чтобы увидеть, есть ли проблема с чтением конфигурации?   -  person jah    schedule 28.06.2015
comment
Он может читать конфигурацию, в остальной части вывода журнала указаны переменные из config.json (включая те, которые я удалил). И если я передам IP-адрес как что-то вроде 0.0.0.0, он говорит, что прослушивает 0.0.0.0:20000. Я также пытался жестко запрограммировать его, просто чтобы посмотреть, не исправит ли он это, и, к сожалению, столкнулся с той же ошибкой.   -  person Jack Hilary    schedule 28.06.2015
comment
На что устанавливается app_host? Является ли этот IP-адрес действительным в вашем контейнере Docker? Я считаю, что Docker использует частный диапазон IP-адресов для своих интерфейсов, поэтому вы не можете напрямую привязываться к внешнему IP-номеру.   -  person robertklep    schedule 28.06.2015
comment
какую команду вы используете для запуска контейнера?   -  person Thomasleveil    schedule 28.06.2015
comment
@robertklep настроен на частный IP-адрес сервера. Как я уже сказал, я бесполезен с Docker, поэтому я понятия не имел, что не могу этого сделать.   -  person Jack Hilary    schedule 28.06.2015
comment
@Thomasleveil Я пытался сделать это как часть сборки Docker (по сути, заменив CMD в конце на узел RUN app.js), и я запустил его с помощью docker run -p 20001:20000 container-name. Оба пути приводят к ошибке.   -  person Jack Hilary    schedule 28.06.2015
comment
@JackHilary Я думаю, что это должно работать, используя 0.0.0.0 как app_host и запуская Docker с -p для сопоставления внешнего порта с внутренним.   -  person robertklep    schedule 28.06.2015
comment
Убедитесь, что порт 20001 еще не используется на хосте Docker. Возможно, у вас уже есть работающий контейнер, сопоставленный с этим портом, используйте docker ps   -  person Thomasleveil    schedule 28.06.2015
comment
@JackHilary, у тебя есть какие-нибудь успехи?   -  person Thomasleveil    schedule 30.06.2015
comment
@Thomasleveil был в процессе публикации здесь. Исправлено, проблема заключалась в явном объявлении IP-адреса. Не объявляя его, позволив ему автоматически установить значение 0.0.0.0 и привязав открытый порт к внешнему порту, это было исправлено. Сайт запущен и работает. Есть ли способ закрыть/ответить на мой собственный вопрос? Я новичок в том, чтобы задавать здесь вопрос.   -  person Jack Hilary    schedule 30.06.2015
comment
Затем вы должны ответить на свой вопрос с подробностями, которые помогут другим, у которых есть такая же проблема. И принять свой собственный ответ   -  person Thomasleveil    schedule 30.06.2015


Ответы (1)


Оказывается, robertklep в комментариях к моему вопросу был прав: проблема заключалась в попытке явно передать IP-адрес сервера в app.js. Таким образом, приложение было настроено на самостоятельную работу с Node, но это невозможно с Docker.

Единственным изменением кода, которое требовалось, было удаление config_json.app_host из app.listen в app.js. Затем запуск контейнера путем привязки открытого порта к любому доступному порту на сервере заставляет его работать.

person Jack Hilary    schedule 30.06.2015