在 Procfile 中指定默认端口

Specifying a default port in a Procfile

我正在使用 foreman 启动一堆服务,并且在 Procfile 中有以下行。

web:    bundle exec rails server -p ${PORT:-3000}

然而,当服务器启动时,它会在 5000 的默认 Foreman 端口上启动,因此看起来注入 3000 作为默认端口的语法是错误的。

我去寻找(其他人给了我上面的行,所以我想修复它)但实际上找不到任何关于如何注入默认值的具体文档。

看着 the source 你看到

def expanded_command(custom_env={})
  env = @options[:env].merge(custom_env)
  expanded_command = command.dup
  env.each do |key, val|
    expanded_command.gsub!("$#{key}", val)
  end
  expanded_command
end

所以很明显 ${PORT:-3000} 语法是错误的。

设置默认端口的正确方法是什么?

更改 Procfile 定义以指向自定义脚本文件:

bundle exec ./script/server

然后,创建 script/server 文件并配置默认值

#!/usr/bin/env bash
cd "$(dirname "[=11=]")/.."
[ $PORT ] || PORT=3000

cmd="bundle exec rails server -p $PORT"
exec $cmd

否则,只需运行 Foreman 传递端口

$ foreman start -p 3000

工头不是 Bash;你不能像那样插入表达式。

你可以这样做:

export PORT=3000 # only once; this is persistent
foreman run

或者像这样:

PORT=3000 foreman run # $PORT is not persistent this way

您可以扩展前者以将 export 命令放入一个 .*rc 文件(例如 .rvmrc),当您切换到该目录时该文件会自动加载。

或者,您可以将后者另存为脚本,然后 运行 将其另存为脚本(如 )。这是我的首选。

(我也在我的PATH里面加上了./bin~/bin,并且把一个默认的脚本如rails s放到后者同名下。然后我不必记住每个项目的 "start server" 命令。)

您可以创建包含以下内容的 .env 文件:PORT=3000,然后在您的 Procfile 中使用 web: bundle exec rails s -p $PORT

更多信息在这里:https://ddollar.github.io/foreman/#ENVIRONMENT

我无法对@PJSCopeland 的回答发表评论,所以我将其添加为另一个答案。工头不是 Bash 但命令写入正确(最后工头执行 Process.spawn 指定的命令)。这里的问题是工头在内部设置了变量 PORT,所以默认的 PORT 值 3000 没有被使用,因为它已经被定义了。

我认为@Kote 的答案是最好的,但完成此任务的另一种方法是更改​​ PORT 变量名称,例如至 SERVER_PORT

web:    bundle exec rails server -p ${SERVER_PORT:-3000}

然后更改默认值 SERVER_PORT 执行:

SERVER_PORT=3100 foreman start