You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Heroku中暴露端口?配置Dockerfile适配$PORT变量

解决Heroku Docker部署中使用$PORT环境变量的问题

一、先修正Dockerfile的执行指令

你当前Dockerfile最后一行用了RUN来启动应用,这可是个关键错误——RUN是镜像构建阶段执行的命令,这时候Heroku还没给你的容器分配动态端口,根本读不到$PORT变量。得换成CMD(或者ENTRYPOINT),这样命令会在容器启动时执行,才能获取到Heroku动态设置的PORT环境变量。

修改后的Dockerfile末尾部分应该是这样:

# 保留你之前所有的构建步骤(安装依赖、打包uberjar等)
RUN lein uberjar

# 加上EXPOSE指令(Heroku不强制要求,但这是Docker的最佳实践,明确镜像要暴露的端口)
EXPOSE $PORT

# 用CMD替换RUN,让应用在容器启动时运行
CMD java $JVM_OPTS -cp target/myapp.jar clojure.main -m myapp.application

二、让Clojure应用读取环境变量中的PORT

你的应用现在是从config里拿:http-port,得让这个配置项优先读取系统环境变量里的PORT值,本地开发时可以留个默认值5000,方便你本地测试。

修改你的配置加载函数:

(defn config []
  {:http-port (Integer/parseInt (or (System/getenv "PORT") "5000"))
   ;; 这里放你其他的配置项
   })

这样app-system里的:http组件就会自动使用动态端口了,不需要改app-system的逻辑——它本来就是用(:http-port config)来获取端口的,现在这个值已经是从环境变量来的了。

三、简单说下原理

  • Heroku会在容器启动前自动设置PORT环境变量,CMD是容器启动时执行的命令,这时候就能正确拿到这个变量。
  • 本地运行时如果没设置PORT环境变量,代码会自动用默认的5000,完全不影响你本地开发测试。

这样调整之后,你的应用就能在Heroku上正常使用动态分配的端口,不会再绑定到localhost:5000啦。

内容的提问来源于stack exchange,提问作者great guy to answer to

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:22:45