在 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
我无法对@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
我正在使用 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
我无法对@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