Как REPL уберджар внутри докера? - PullRequest
0 голосов
/ 25 апреля 2018

Я считаю REPL мощным и полезным инструментом.В настоящее время я запускаю: lein repl для взаимодействия с моим приложением Clojure через REPL.Тем не менее, я только недавно заключил контейнер в свой проект.Приложение теперь находится внутри контейнера док-станции как отдельный автономный файл Uberjar.

Поэтому я хотел бы знать, как запустить REPL для файла uberjar, который находится внутри контейнера Docker?

1 Ответ

0 голосов
/ 25 апреля 2018

Начиная с Clojure 1.8, вы можете указать опцию JVM для размещения REPL без внесения каких-либо изменений в ваше скомпилированное приложение:

-Dclojure.server.repl="{:port 5555 :accept clojure.core.server/repl}"

В вашей Dockerfile ваша основная команда будеттеперь выглядит примерно так:

java -Dclojure.server.repl="{:port 5555 :accept clojure.core.server/repl}" -jar path/to/app.jar

Вы также можете добавить эту опцию в Leiningen project.clj вместо командной строки:

:jvm-opts ["-Dclojure.server.repl={:port 5555 :accept clojure.core.server/repl}"]

Пока ваше приложение работает, вы должны иметь возможностьдля подключения к этому сокету, предполагая, что ваш контейнер имеет открытый порт (EXPOSE 5555 in Dockerfile):

$ telnet 127.0.0.1 5555
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
user=> (+ 1 1)
2
user=> (doto 'sandbox.main require in-ns)
sandbox.main
sandbox.main=>

В качестве альтернативы, вы можете разместить REPL из кода вашего приложения, как описано в этот ответ .

(ns sandbox.main
  (:require [clojure.tools.nrepl.server :as serv]))

(defn -main []
  (serv/start-server :port 7888)
  ... do other stuff ...)

и подключиться к нему с помощью lein repl :connect localhost:7888.

...