我的 Go 服务器无法在 cloud foundry 中启动

My Go server fails to start in cloud foundry

我有一个简单的 GO 服务器,我正试图将其推送到 Bosh lite 上的云铸造厂(Vagrant + Virtual box。)

这是我的 go 应用程序的源代码设置:

我的 weight.go 是一个监听 9000 的简单服务器。

1) manifest.yml 看起来像这样。

applications:
- name: weight
  memory: 128MB
  instances: 1

2 ) Procfile 看起来像这样。

worker: bin/weight

3 ) 我使用默认的构建包。

4 ) 当我使用 cf push weight -c "./bin/weight;sleep 1d" 推送我的应用程序时,我得到:

a-424e-b509-6df11fb32cc7 ({"state"=>"STOPPED"})
2016-03-13T11:02:45.70-0700 [DEA/0]      OUT Got staging request for app with id 16d3795a-8cda-424e-b509-6df11fb32cc7
2016-03-13T11:02:46.84-0700 [API/0]      OUT Updated app with guid 16d3795a-8cda-424e-b509-6df11fb32cc7 ({"state"=>"STARTED"})
2016-03-13T11:02:46.89-0700 [STG/0]      OUT -----> Downloaded app package (12K)
2016-03-13T11:02:48.76-0700 [STG/0]      OUT -----> Downloaded app buildpack cache (78M)
2016-03-13T11:02:48.82-0700 [STG/0]      ERR Cloning into '/tmp/buildpacks/go-buildpack'...
2016-03-13T11:03:05.66-0700 [STG/0]      OUT Submodule 'compile-extensions' (https://github.com/cloudfoundry/compile-extensions.git) registered for path 'compile-extensions'
2016-03-13T11:03:05.68-0700 [STG/0]      ERR Cloning into 'compile-extensions'...
2016-03-13T11:03:07.59-0700 [STG/0]      OUT Submodule path 'compile-extensions': checked out '26a578c06a62c763205833561fec1c5c6d34deb6'
2016-03-13T11:03:07.61-0700 [STG/0]      OUT -------> Buildpack version 1.7.3
2016-03-13T11:03:09.81-0700 [STG/0]      OUT https://pivotal-buildpacks.s3.amazonaws.com/concourse-binaries/godep/godep-v55-linux-x64.tgz
2016-03-13T11:03:09.88-0700 [STG/0]      OUT -----> Checking Godeps/Godeps.json file.
2016-03-13T11:03:09.92-0700 [STG/0]      OUT -----> Using go1.5.3
2016-03-13T11:03:09.92-0700 [STG/0]      OUT -----> Running: godep go install -tags cloudfoundry .
2016-03-13T11:03:11.19-0700 [STG/0]      OUT -----> Uploading droplet (2.0M)
2016-03-13T11:03:25.11-0700 [DEA/0]      OUT Starting app instance (index 0) with guid 16d3795a-8cda-424e-b509-6df11fb32cc7
2016-03-13T11:03:34.93-0700 [DEA/0]      OUT Removing crash for app with id 16d3795a-8cda-424e-b509-6df11fb32cc7
2016-03-13T11:03:34.93-0700 [DEA/0]      OUT Stopping app instance (index 0) with guid 16d3795a-8cda-424e-b509-6df11fb32cc7
2016-03-13T11:03:34.93-0700 [DEA/0]      OUT Stopped app instance (index 0) with guid 16d3795a-8cda-424e-b509-6df11fb32cc7
2016-03-13T11:03:56.81-0700 [DEA/0]      OUT Starting app instance (index 0) with guid 16d3795a-8cda-424e-b509-6df11fb32cc7
**2016-03-13T11:03:57.79-0700 [DEA/0]      ERR Instance (index 0) failed to start accepting connections**
2016-03-13T11:03:57.80-0700 [API/0]      OUT App instance exited with guid 16d3795a-8cda-424e-b509-6df11fb32cc7 payload: {"cc_partition"=>"default", "droplet"=>"16d3795a-8cda-424e-b509-6df11fb32cc7", "version"=>"2eeebbf8-e84e-412a-aeba-2adc0cffea6b", "instance"=>"910eba711c6e414bb7c6324565d0a9af", "index"=>0, "reason"=>"CRASHED", "exit_status"=>127, "exit_description"=>"failed to accept connections within health check timeout", "crash_timestamp"=>1457892237}

我试过设置

cf set-env weight PORT 9000

没有成功, 我在用清单和 yaml 做一些时髦的事情吗?

weight.go 在本地运行。

代码:

func main (){
    http.HandleFunc("/weight", weightHandler)
    err:=http.ListenAndServe("localhost:"+getPort(), nil)
    if err != nil {
        fmt.Println("got an err ")
        log.Fatalln(err)
    }else{
        fmt.Println("Apparently it works ?")
    }
    //fmt.Println("Hi")
    //time.Sleep(1*time.Hour)
}

func getPort() string {
    var port string
    if port = os.Getenv("PORT"); len(port) == 0 {
        fmt.Println("Didn't Found it")
        fmt.Println(port)
        port = DEFAULT_PORT
    }else{
        fmt.Println("Gotim")
        fmt.Println(port)
    }
    return port
}

我确实得到了随机 PORT CF 分配的日志,仍然停留在

2016-03-13T16:58:40.90-0700 [API/0]      OUT App instance exited with guid e5d417bd-c38d-4239-aa61-e9ca67fce79a payload: {"cc_partition"=>"default", "droplet"=>"e5d417bd-c38d-4239-aa61-e9ca67fce79a", "version"=>"8d7e80b3-69d5-4c83-9d37-1159d5deeba8", "instance"=>"14223d325c204406b87a131c065c16cc", "index"=>0, "reason"=>"CRASHED", "exit_status"=>-1, "exit_description"=>"failed to accept connections within health check timeout", "crash_timestamp"=>1457913520}

*修复:问题是在本地主机上监听,我没有指定 IP,我很高兴去 *

来自有关故障排除的 Cloud Foundry 文档:

Make sure your application code uses the PORT environment variable. Your application may be failing because it is listening on the wrong port. Instead of hard coding the port on which your application listens, use the PORT environment variable. [Source]

来自关于环境变量的 Cloud Foundry 文档:

The port on which the application should listen for requests. The Cloud Foundry runtime allocates a port dynamically for each instance of the application, so code that obtains or uses the application port should refer to it via the PORT environment variable. [Source]

因此,与其将您的应用程序硬编码为侦听端口 9000,不如侦听 PORT 环境变量指定的端口,如果未设置该环境变量,则可以默认为 9000。