启动 Go 服务器后,CodeDeploy AfterInstall 挂钩不会退出

CodeDeploy AfterInstall hook does not exit after starting Go server

我有一个简单的 Go 服务器。下面的代码。 server.go

package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

我有一个带有 CodeDeploy 代理的 EC2 服务器,一切就绪。我想要做的就是,一旦我将新代码推送并合并到我的 Github 存储库的主分支,CodeDeploy 应该就地部署修订到我的 EC2 服务器,下面是我的 appspec.yml(在我的回购协议的根目录)

appspec.yml

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ubuntu/go/myproject
hooks:
  AfterInstall:
  - location: after-install.sh
    runas: ubuntu

after-install.sh 下面的脚本。很简单,将修改部署到EC2中的myproject文件夹后,cd进入该文件夹并启动go服务器。

#!/bin/bash

cd $HOME/go/myproject
/usr/local/go/bin/go run server.go &

问题:通过上述,修订已完美部署,服务器已启动,我可以从浏览器访问端口 8080 上的 public dns 并查看更改。但是,CodeDeploy 保持 运行 并且从不显示部署已完成。

在启动 Go 服务器后,我应该做些什么来使 CodeDeploy 正常完成?

根据 documentation 你不应该这样做。

You cannot simply add an ampersand (&) in after-install.sh to run sleep.sh in the background.

如果下面是你的钩子文件

#!/bin/bash
# Do not do this.
/tmp/sleep.sh &

您需要在 & 之前添加 > /dev/null 2> /dev/null < /dev/null,如下所示

#!/bin/bash
/tmp/sleep.sh > /dev/null 2> /dev/null < /dev/null &

对于您的文件,应该更新为如下所示

#!/bin/bash

cd $HOME/go/myproject
/usr/local/go/bin/go run server.go > /dev/null 2> /dev/null < /dev/null &