Как подключиться к NREPL в док-контейнере

Кто-нибудь смог привязаться к [java.net InetSocketAddress ServerSocket] изнутри докера? У меня есть простой процесс NRepl, работающий в док-контейнере. Но я не могу подключиться к этому процессу NRepl.

Мой docker-compose.yml выглядит примерно так.

version: '3'
services:
  foo:
    ports:
      - ${NREPL_PORT:-7001}:7001

В докеризованном приложении происходит привязка к хосту/порту, как показано ниже.

InetSocketAddress ia = new InetSocketAddress("0.0.0.0" 7001);

ServerSocket s = new ServerSocket();
s.setReuseAddress(true);
s.bind(ia);

Но я постоянно получаю сообщение об ошибке при попытке подключения из-за пределов докера.

λ lein repl :connect localhost:7001
Connecting to nREPL at localhost:7001
SocketException The transport's socket appears to have lost its connection to the nREPL server
        nrepl.transport/bencode/fn--9182/fn--9183 (transport.clj:108)
        nrepl.transport/bencode/fn--9182 (transport.clj:108)
        nrepl.transport/fn-transport/fn--9150 (transport.clj:55)
        clojure.core/binding-conveyor-fn/fn--5739 (core.clj:2030)
        java.util.concurrent.FutureTask.run (FutureTask.java:266)
        java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
        java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
        java.lang.Thread.run (Thread.java:745)

Я пытался прослушивать эти адреса (прослушивание локального хоста было бы недоступно с хоста докера), но каждый раз я получаю одну и ту же ошибку.

  "0.0.0.0"
  "::"

И при запуске я проверяю и открываю ожидаемые порты.

λ docker ps
CONTAINER ID    IMAGE      COMMAND       CREATED         STATUS         PORTS                     NAMES
4d39d81fba69    api_api    "lein run"    5 minutes ago   Up 5 minutes   0.0.0.0:7001->7001/tcp    api_api_1

Это похожие вопросы (a, b), что не совсем помогло в мое дело.


person Nutritioustim    schedule 15.01.2020    source источник
comment
Вы описываете, что происходит внутри контейнера Docker, как если бы это был код Java — не так ли? nrepl может подключаться только к серверу nrepl, а не к произвольному серверу сокетов.   -  person Sean Corfield    schedule 16.01.2020
comment
@SeanCorfield Итак, у меня это работает. Что-то странное происходило с таблицами маршрутизации между моим хостом и докером. Теперь все хорошо. Спасибо за продолжение.   -  person Nutritioustim    schedule 17.01.2020
comment
@Nutritioustim, как ты это решил? У меня похожая проблема, и раньше у меня были странные проблемы с сетью докеров.   -  person Mattias Arro    schedule 03.05.2021