0

更新:自从最初的一组评论者留下回复以来,这个问题已经改变。对任何混淆表示歉意。


这是我的代码存储库https://github.com/Integralist/spurious-clojure-example您可以将其用作我正在使用的示例。

请注意,上述 repo 依赖于我尚未发布到 Clojars 的库(因为我仍在测试它 - 因此打开了这个问题)。您可以在此处查看该库的源代码:https ://github.com/Integralist/spurious-clojure-aws-sdk-helper

lein ring server我有一个用 Compojure 编写的“hello world”Clojure Web 应用程序,我在使用and运行时运行良好lein run(因为我-main现在创建了一个函数)。当编译成 jar 并运行java -jar app.jar.

我现在的问题是,如果我尝试java -jar app.jar从 Docker 容器中运行默认值,我会收到以下错误告诉我...

spurious-clojure-example is starting
2015-02-14 00:58:03.812:INFO:oejs.Server:jetty-7.x.y-SNAPSHOT
2015-02-14 00:58:03.854:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8080
Started server on port 8080
Exception in thread "main" java.awt.HeadlessException:

我的代码目前正在使用-main这样的函数......

(ns spurious-clojure-example.repl
  (:use spurious-clojure-example.handler
        ring.server.standalone
        [ring.middleware file-info file])
  (:gen-class))

(defonce server (atom nil))

(defn get-handler []
  (-> #'app
    (wrap-file "resources")
    (wrap-file-info)))

(defn start-server
  "used for starting the server in development mode from REPL"
  [& [port]]
  (let [port (if port (Integer/parseInt port) 8080)]
    (reset! server
            (serve (get-handler)
                   {:port port
                    :init init
                    :auto-reload? true
                    :destroy destroy
                    :join true}))
    (println (str "You can view the site at http://localhost:" port))))

(defn stop-server []
  (.stop @server)
  (reset! server nil))

(defn -main []
  (start-server))

...但是如何让服务器无头启动?我不能完全按照 Compojure 样板代码来破译它在哪里或如何知道何时无头运行或通过浏览器运行?

我知道在命令行上你可以这样做lein ring server-headless,那么程序化的等价物是什么?

4

2 回答 2

2

因为 ring-server 主要用于开发,它会在服务器启动时尝试打开浏览器。这java.awt.HeadlessException在没有 GUI 的平台上失败。您需要将该:open-browser?选项设置为 false 以防止这种情况发生。

于 2015-02-20T18:23:13.513 回答
0

来自EXPOSE 上的官方 Docker 文档

EXPOSE 指令通知 Docker 容器将在运行时侦听指定的网络端口。Docker 使用此信息通过链接互连容器(请参阅 Docker 用户指南),并在使用 -P 标志时确定要向主机公开哪些端口。注意:EXPOSE 没有定义哪些端口可以暴露给主机,或者默认情况下可以从主机访问端口。 要向主机公开端口,请在运行时使用 -p 标志或 -P 标志

因此,如果您在 Docker 中手动设置环服务器端口,请project.clj确保在 Dockerfile 中也使用相同的端口,然后在启动 docker 时通过 -p 或 -P 提供映射。

我不能肯定地说,但我相信您的无头错误消息不会导致您的问题。

于 2015-02-20T14:11:35.117 回答