0

更新: この質問は、元の一連のコメント投稿者が回答を残してから変更されました。混乱をお詫び申し上げます。


これは私のコード リポジトリhttps://github.com/Integralist/spurious-clojure-exampleで、私が取り組んでいるものの例として使用できます。

上記のリポジトリは、Clojars にまだ公開していないライブラリに依存していることに注意してください (まだテストしているため、この質問が開かれました)。ここでライブラリのソースコードを見ることができます: https://github.com/Integralist/spurious-clojure-aws-sdk-helper

私は Compojure で書かれた "hello world" Clojure Web アプリを持ってlein ring serverlein 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 フラグを使用します

そのため、リング サーバー ポートを で手動で設定してproject.cljいる場合は、Dockerfile でも同じポートを使用していることを確認し、docker の起動時に -p または -P を使用してマッピングを提供します。

確かなことは言えませんが、ヘッドレス エラー メッセージは問題の原因ではないと思います。

于 2015-02-20T14:11:35.117 に答える