如何在Heroku中获取当前主机名

时间:2012-05-21 13:50:12

标签: heroku clojure noir

我正在玩Heroku上部署Clojure / Noir应用程序,我的应用程序大部分都在工作。但是,我需要的最后一件事是在Heroku上部署时找出我的应用程序的主机名。理想情况下,我想动态地执行此操作,而不是对其进行硬编码。

因此,例如,如果我的应用的网址为“http://freez-windy-1800.herokuapp.com”,我希望能够在我的clojure代码中动态获取此内容。

我知道我可以查看传入的请求来解决这个问题,但理想情况下,我想要某种“设置”,我在一次评估表达式并将值保存在变量中然后我可以使用(来自Python / Django世界,我在考虑Clojure中的settings.py等价物。)

作为参考,我正在部署的代码位于https://github.com/rmanocha/cl-short

3 个答案:

答案 0 :(得分:5)

您可以通过

在Heroku中设置环境变量
heroku config:add BASE_IRI=http://freez-windy-1800.herokuapp.com

并在Clojure中读回来

(defn- base-iri []
  (or (System/getenv "BASE_IRI") "http://localhost/"))

Heroku已设置您可以使用的PORT

(defn -main []
  (let [port (Integer. (or (System/getenv "PORT") 8080))]
    (run-jetty #'app {:port port})))

在不同环境中适合我。

答案 1 :(得分:2)

您通常会使用Java标准库中的InetAddress执行此操作。

(.getCanonicalHostName (java.net.InetAddress/getLocalHost))

但是,这不会进行DNS查找。

答案 2 :(得分:0)

3种获取主机名的方法。随便使用。

(ns service.get-host-name
  (require [clojure.java.shell :as shell]
           [clojure.string :as str])
  (:import [java.net InetAddress]))

(defn- hostname []
  (try
    (-> (shell/sh "hostname") (:out) (str/trim))
    (catch Exception _e
      (try
        (str/trim (slurp "/etc/hostname"))
        (catch Exception _e
          (try
            (.getHostName (InetAddress/getLocalHost))
            (catch Exception _e
              nil)))))))