fpga中的slack_在Go中创建一个Slack Docker代理-第2部分

fpga中的slack

在上一篇文章中,我们了解了如何使用go和几个小型库轻松创建slack-docker-proxy。 在第二篇文章中,我们将向您展示添加其他命令有多么容易,并且我们将研究如何对这个组件进行dockerize,以便您可以在docker守护进程中轻松地运行它。 请注意,当然可以在slack-proxy github存储库中找到各种go文件的完整资源。

在Docker中运行Go应用程序

首先让我们看一下如何部署和运行此代理。 我们看到可以直接从命令行运行它,如下所示:

$ export GOPATH=directory/where/you/cloned/the/repo
$ go get github.com/fsouza/go-dockerclient
$ go build src/github.com/josdirksen/slackproxy/slack-proxy.go
$ ./slackproxy -config ./resources/config.json

但这不是最实用的方法。 并且由于我们已经使用它来监视docker,为什么不直接在docker内部运行该代理。

要在docker中运行go-lang应用程序,我们可以使用两种不同的方法。 我们可以从命令行编译应用程序,然后仅将其复制到docker映像中,也可以将源添加到包含所需的所有go内容的映像中,并在创建docker映像时将其编译。 我们将采用第二种方法。

我们已经显示了将在此处使用的docker文件:

FROM golang:latest 
COPY src/ /go/src/
COPY resources/config.json /
EXPOSE 9000

# If external packages are needed, install them manually. Not needed if installed in the GOPATH
RUN go get github.com/fsouza/go-dockerclient && go install github.com/fsouza/go-dockerclient

WORKDIR src
RUN go build -o /app/main github.com/josdirksen/slackproxy/slack-proxy.go

CMD ["/app/main", "--config", "/config.json"]

这些步骤应该很容易解释。 我们要做的是确保源代码位于docker映像预期的位置(/ go / src文件夹),安装所有外部依赖项并仅运行“ docker build”。 结果如下:

$ docker build .
Sending build context to Docker daemon 203.8 kB
Step 1 : FROM golang:latest
 ---> bc422006801e
Step 2 : COPY src/ /go/src/
 ---> Using cache
 ---> a7c813facaf8
Step 3 : COPY resources/config.json /
 ---> Using cache
 ---> b6fd55de16f6
Step 4 : EXPOSE 9000
 ---> Using cache
 ---> d30199bcc59a
Step 5 : WORKDIR /go/src
 ---> Using cache
 ---> e861b557571d
Step 6 : RUN go get github.com/fsouza/go-dockerclient && go install github.com/fsouza/go-dockerclient
 ---> Running in 6f712526bb99
 ---> 76cecb4c7a19
Removing intermediate container 6f712526bb99
Step 7 : RUN go build -o /app/main github.com/josdirksen/slackproxy/slack-proxy.go
 ---> Running in 77c092d1bcf2
 ---> f7ca02665f94
Removing intermediate container 77c092d1bcf2
Step 8 : CMD /app/main --config /config.json
 ---> Running in 0bbeb60ca608
 ---> ebd9d3fe8ce7
Removing intermediate container 0bbeb60ca608
Successfully built ebd9d3fe8ce7

生成的图像现在可以这样运行:

$ docker run 94abcb31af14
{5cLHiZjpWaRDb0fP6ka02XCR {[{local tcp://192.168.99.100:2376 true /Users/jos/.docker/machine/machines/eris ca.pem cert.pem key.pem}]}}

或通过标记将其上传到本地注册表:

docker tag 94abcb31af14 my.own.registry/slack-proxy:latest

扩展新功能

使用新功能扩展此代理确实非常容易。 我们常见的情况是,在部署某些东西后,它们停止工作了,我们可以快速检查日志文件。 现在登录机器并使用docker log并不难,但是需要几个步骤。 因此,我们将添加支持以直接从Slack查看日志文件。 我们将首先在dockerCommandHandlers.go文件中定义函数。

func handleLogsCommand(client *docker.Client, cmd *Command, w http.ResponseWriter) {
	var tail = "all"
	if (len(cmd.OtherArguments) == 2) {
		tail = cmd.OtherArguments[1]
	}
	logoptions := docker.LogsOptions{Container: cmd.OtherArguments[0], Stdout: true, Stderr: true, Follow: false, Tail: tail, OutputStream: w, ErrorStream: w}
	client.Logs(logoptions)
}

请注意,我们再次没有真正进行任何输入验证。 我们只假设传入了正确数量的参数。现在我们有了函数,我们将同一文件中的HandleCommand函数更新为:

func (dh DockerHandler) HandleCommand(cmdToExecute *Command, w http.ResponseWriter) {
	client := setupDockerClient(cmdToExecute.Environment)

	fmt.Printf("%+v\n", cmdToExecute)

	switch cmdToExecute.SlackCommand {
	case "ps" : handlePsCommand(client, w)
	case "logs" : handleLogsCommand(client, cmdToExecute, w)
	case "imgs" : handleListImagesCommand(client, w)
	}

我们完成了。 现在,当这样拨打电话时:

$ curl 'http://localhost:9000/handleSlackCommand' -H 'Content-Type: application/x-www-form-urlencoded' --data 
   'token=5cLHiZjpWaRDb0fP6ka02XCR&team_id=T0001&team_domain=example&channel_id=C2147483705&channel_name=test&user_id=jos,nd=docker&text=local+logs+669265a13436+10'
 
> 2016/02/07 18:48:04 [WARN] agent: Check 'service:wiremock' is now warning
> 2016/02/07 18:48:09 [WARN] agent: Check 'service:dag-storage' is now warning
> 2016/02/07 18:48:17 [WARN] agent: Check 'service:wiremock' is now warning
> 2016/02/07 18:48:19 [WARN] agent: Check 'service:dag-storage' is now warning
> 2016/02/07 18:48:29 [WARN] agent: Check 'service:dag-storage' is now warning
> 2016/02/07 18:48:30 [WARN] agent: Check 'service:wiremock' is now warning
> 2016/02/07 18:48:39 [WARN] agent: Check 'service:dag-storage' is now warning
> 2016/02/07 18:48:43 [WARN] agent: Check 'service:wiremock' is now warning
> 2016/02/07 18:48:49 [WARN] agent: Check 'service:dag-storage' is now warning
> 2016/02/07 18:48:56 [WARN] agent: Check 'service:wiremock' is now warning

我们返回ID为669265a13436的容器的最新10条日志条目。

或者,如果您更倾向于使用Postman。

邮差日志

除了docker扩展

到目前为止,我们仅关注通过此最小代理公开docker。 通过此设置公开其他服务,组件和信息源实际上确实很容易。 作为示例,让我们编写一些命令来公开运行slack-proxy的主机的信息。 为此,我们首先添加一个新的CommandHandler:

func handleHostCommand(w http.ResponseWriter) {
	var buffer bytes.Buffer

	info, _ := host.HostInfo()
	buffer.WriteString(fmt.Sprintf("Boottime: %v\n", info.BootTime))
	buffer.WriteString(fmt.Sprintf("Hostname: %v\n", info.Hostname))
	buffer.WriteString(fmt.Sprintf("Uptime: %v\n", info.Uptime))

	io.WriteString(w, buffer.String())

如果您看过我们设置docker处理程序的方式,那么这不应该让人感到意外。 我们使用一个简单的开关来匹配我们需要执行的命令,在这种情况下,请使用gopsutil库返回文件系统信息。 请注意,如果要在没有docker的情况下运行它,则首先必须执行“ go github.com/shirou/gopsutil”。 由于添加了额外的命令处理程序,因此我们还需要对handlerFactory的GetHandler函数进行一些小的更改:

func GetHandler(handlerName string, config *config.Configuration) CommandHandler {
	switch handlerName {
	case "docker": return NewDockerHandler(config)
	case "system" : return NewSystemHandler()
	default: return NewDummyHandler()
	}
}

进行此更改后,当命令为system时,我们将返回刚刚创建的处理程序,如果命令为docker,则将返回可以处理docker命令的处理程序。 要查看实际效果,可以使用以下curl命令获取内存信息:

$ curl 'http://localhost:9000/handleSlackCommand' -H 'Content-Type: application/x-www-form-urlencoded' --data 'token=5cLHiZjpWaRDb0fP6ka02XCR&team_id=T0001&team_domain=example&channel_id=C2147483705&channel_name=test&user_id=jos,nd=system&text=local+mem'
 
> Total: 17179869184, Free:41549824, UsedPercent:65.031576

要测试主机信息,请使用以下命令:

$ curl 'http://localhost:9000/handleSlackCommand' -H 'Content-Type: application/x-www-form-urlencoded' --data 'token=5cLHiZjpWaRDb0fP6ka02XCR&team_id=T0001&team_domain=example&channel_id=C2147483705&channel_name=test&user_id=jos,nd=system&text=local+host'
 
> Boottime: 1453982905Hostname: Joss-MacBook-Pro.localUptime: 889269%

到此为止,我们就在本文的结尾处,介绍了使用go-lang的slack / docker(及其他来源)。 您可以在此处找到本文的完整资源。 如果您有建议,请告诉我。

翻译自: https://www.javacodegeeks.com/2016/02/create-slack-docker-proxy-go-part-2.html

fpga中的slack

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值