Docker最全教程之Go实战,墙裂推荐(十八)

Aurora988 等级 450 0 0

前言

与其他语言相比,Go非常值得推荐和学习,真香!为什么?主要是可以直接编译成机器代码(性能优越,体积非常小,可达10来M,见实践教程图片)而且设计良好,上手门槛低。本篇主要侧重于讲解了Go语言的优势,并且提供了一个推送钉钉消息的Demo。最后由于技痒,也编写了一个.NET Core的Demo,作为简单的对照(见下一篇)。

目录

  • Go

  • Go的优势

  • 官方镜像

  • 使用Go推送钉钉消息

  • 了解钉钉机器人

  • 定义消息类型

  • 从环境变量获取参数

  • 设置消息格式并发送请求

  • 设置Dockerfile

  • 运行并设置环境变量推送消息

Go

Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。在2016年,Go被软件评价公司TIOBE 选为“TIOBE2016 年最佳语言”。

和其他语言的规定相比,在Go中有几项不同的强制的规定,当不匹配以下规定时编译将会产生错误:

  • 每行程序结束后不需要撰写分号(;)。

  • 大括号({)不能够换行放置。

  • if判断式和for循环不需要以小括号包覆起来。

Go的优势

相比其他语言,Go语言主要有以下优势:

  • 可直接编译成机器代码,不依赖其他库;

  • 丰富的内置数据类型(error也是基本的数据类型)

  • 语言层面支持并发;

  • 设计良好(虽然不算优秀,但是恰到好处,特别实用)

  • 支持垃圾回收;

  • 规范(不规范直接编译报错,这点太生猛了)、简单、易学;

  • 丰富的标准库;

  • 跨平台编译;

  • 性能相对强劲;

  • 部署简单;

  • 生态丰富

Go的性能强劲,但是又比C/C++的开发效率高(Go语言的开发者很多都是从C/C++转换过来的,上手几乎没门槛),维护成本更低,同时开发效率又不弱于Python等动态语言,而且还支持编译,可能减少很多低级错误。除此之外,Go还有个很大的优势,Go和.NET Core一样,讲的好听一点呢,就是出身名门、血统纯正,讲的不好听一点呢,都是富二代,都有一个好爹。

Docker最全教程之Go实战,墙裂推荐(十八)

我们的系列教程的主角Docker,就是基于Go语言编写。由于以上一些特性,Go特别适合云计算相关服务开发(关于这一点,大家可以关注各大云厂商的开源项目)、服务器编程、分布式系统、网络编程、内存数据库等等。

Docker最全教程之Go实战,墙裂推荐(十八)

官方镜像

官方镜像地址:

https://hub.docker.com/_/golang

由于爹好,所以官方文档比较详细:

Docker最全教程之Go实战,墙裂推荐(十八)

同样,我们可以使用docker images golang命令来查看相关镜像。这里值得注意的是,一般情况下,请使用带有alpine标签的golang镜像,因为体积更小。

Docker最全教程之Go实战,墙裂推荐(十八)

使用Go推送钉钉消息

接下来,我们使用Go编写一个简单的Demo:即通过钉钉机器人WebHooks推送消息到钉钉。

目前钉钉已经普遍应用于办公领域,通过对接钉钉机器人,我们可以将一些希望相关团队关注的信息推送到相应的钉钉群。

了解钉钉机器人

在开始之前,我们需要对钉钉机器人有个大致的了解:

https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq

这里我们是使用自定义机器人。当前自定义机器人支持文本 (text)、连接 (link)、markdown (markdown)、ActionCard、FeedCard消息类型,我们可以根据自己的使用场景选择合适的消息类型,达到最好的展示样式。例如我们用的比较多的是markdown类型:

Docker最全教程之Go实战,墙裂推荐(十八)

定义消息类型

我们暂且定义文本和markdown类型:

Docker最全教程之Go实战,墙裂推荐(十八)

 Docker最全教程之Go实战,墙裂推荐(十八)

从环境变量获取参数

我们可以通过环境变量来传参。

  • 定义环境变量参数:
//环境变量
 varenvList = []string{ //钉钉机器人地址

    "WEBHOOK", //@的手机号码

    "AT_MOBILES", //@所有人

    "IS_AT_ALL", //消息内容

    "MESSAGE", //消息类型(仅支持文本和markdown)

    "MSG_TYPE",

} 
  • 从环境变量获取参数并校验
//获取环境变量
 envs:= make(map[string]string)

    for_, envName :=rangeenvList {

        envs[envName]= os.Getenv(envName) //参数检查
 ifenvs[envName]==""&&envName !="AT_MOBILES"&&envName !="IS_AT_ALL"{

            fmt.Println("envionmentvariable "+envName+" isrequired")

            os.Exit(1)

        }

    }



    ifenvs["AT_MOBILES"] ==""&& envs["IS_AT_ALL"] ==""{

        fmt.Println("必须设置参数AT_MOBILES和IS_AT_ALL两者之一!")

        os.Exit(1)

    }

设置消息格式并发送请求

相关包引用如下:

i

mport( "bytes"

    "encoding/json"

    "fmt"

    "io/ioutil"

    "net/http"

    "strings" )

关键代码如下所示:

Docker最全教程之Go实战,墙裂推荐(十八)

Docker最全教程之Go实战,墙裂推荐(十八)

设置Dockerfile

Dockerfile如下所示:

FROM golang:1.10-alpineasbuilder WORKDIR /go/src/component-dingding COPY .//go/src/component-dingding



RUN set -ex&& 

go build -v -o/go/bin/component-dingding 

-gcflags'-N -l' .\/*.go



FROM alpine

RUN apk update&& apk add ca-certificates



COPY --from=builder/go/bin/component-dingding /usr/bin/

CMD ["component-dingding"]



#注意不要单独使用MAINTAINER指令,MAINTAINER已被Label标签代替

LABEL MAINTAINER ="xinlai@xin-lai.com"

# LABEL指令用于将元数据添加到镜像,支持键值对和JSON,我们可以使用docker inspect命令来查看

LABEL DingtalkComponent='{

  "description": "使用钉钉发送通知消息.",

  "input": [

    {"name": "WEBHOOK","desc": "必填,钉钉机器人Webhook地址"},

    {"name": "AT_MOBILES","desc": "非必填,被@人的手机号"},

    {"name": "IS_AT_ALL","desc": "非必填,@所有人时:true,否则为:false"},

    {"name": "MESSAGE","desc": "必填,自定义发送的消息内容"},

    {"name": "MSG_TYPE","desc": "必填,自定义发送的消息类型,目前仅支持text和markdown"}

  ]

}'

这里我们使用了标签来说明参数,我们可以使用以下命令来查看标签:

docker inspect go-dingtalk

Docker最全教程之Go实战,墙裂推荐(十八)

Docker最全教程之Go实战,墙裂推荐(十八)

编译出来的镜像非常小,使用了分阶段构建,因为alpine的镜像非常小,而go可以直接编译成机器代码:

Docker最全教程之Go实战,墙裂推荐(十八)Docker最全教程之Go实战,墙裂推荐(十八)

看到这个大小,是不是相对惊诧呢!!其实.NET Core也支持,需要用到CoreRT(.NET Core Runtime,C++的性能,.NET的生产力),不过目前虽然可用,但是还不算完全成熟。有兴趣的可以了解下官方的这个开源库:

https://github.com/dotnet/corert

注意:

Alpine Linux 是一个社区开发的面向安全应用的轻量级Linux发行版。从上图我们可以看到,它非常非常小,只有5M,这是其最大的优势。因此,其非常适合用来做Docker镜像、路由器、防火墙、VPNs、VoIP 盒子以及服务器的操作系统。

运行并设置环境变量推送消息

运行并设置环境变量推送消息

我们使用PowerShell编写简单脚本如下所示:

docker build --rm-f"Dockerfile"-t go-dingtalk:latest .



docker run --rm -e"WEBHOOK=https://oapi.dingtalk.com/robot/send?access_token={AccessToken}"` -e"MESSAGE=*使用go发送钉钉消息。*"` -e"IS_AT_ALL=true"` -e"MSG_TYPE=markdown"` -d go-dingtalk

注意:

--rm用于自动清理。也就是用之即来,用完即走。

推送成功后,效果图如下所示:

Docker最全教程之Go实战,墙裂推荐(十八)

Docker最全教程之Go实战,墙裂推荐(十八)

写到这里,笔者有些技痒了!!于是准备试试使用.NET Core也编写类似代码,下节内容将持续更新,敬请关注!

收藏
评论区

相关推荐

godoc 命令和 golang 代码文档管理
介绍 godoc 是 golang 自带的文档查看器,更多的提供部署服务 go doc 和 godoc 在 golang 1.13 被移除了,可以自行安装 golang.org go1.13 godoc(https://links.jianshu.com/go?tohttps%3A%2F%2Fgolang.org%2Fdoc%2Fg
安装docker时,遇到Loaded plugins...怎么办
前言 Hey,大家好,我是码农,星期八,我们在安装Docker时,通常下面三条命令就能安装成功。 下载Docker依赖 yum y install yunutils devicemapperpersistentdata lvm2 设置一个下载Docker镜像源 yum y install yumutils 配置下载源 yumcon
深入理解 Go Slice
(https://imghelloworld.osscnbeijing.aliyuncs.com/0ce8a8773a658d4b843e5796a0dbf001.png) image 原文地址:深入理解 Go Slice(https://github.com/EDDYCJY/blog/blob/master/golang/pkg/20
Tornado API 服务开发
本文讲述如何使用 Tornado(http://www.tornadoweb.org/) Web 框架来开发一个简单的 API 服务,以及如何使用 Docker 工具来构建镜像和部署服务。项目代码已在 GitHub 开源,JW Tornado Demo(https://github.com/jaggerwang/jwtornadodemo)。
Docker 起死回生了
(https://imghelloworld.osscnbeijing.aliyuncs.com/3a5538f299bb09456db9cb4393a8f6de.png) Docker 公司在近两年里一直深陷生存危机。 2019 年时两度更换 CEO、毅然出售企业业务之后,人们对于 Docker 曾经一度看衰。 2020 年 12 月,
如何监控docker的运行状况
目录前言正文查询结果参数解析 前言监控docker容器的运行状态是非常普遍的需求,这就是我们今天的讨论内容。 正文部署了docker容器之后,我们经常会需要查看容器的运行状态,这里介绍一个非常好用的命令: docker stats 如果宿主机上有大量的容器在运行,你会看到所有的容器信息,因此我们也可以查看我们关心的某个容器,假如名字为 builde
为什么很多公司都转型go语言开发?Go语言能做什么
Go语言能做什么一、我们为什么选择Go语言选择Go语言的原因可能会有很多,关于Go语言的特性、优势等,我们在之前的文档中也已经介绍了很多了。但是最主要的原因,应该是基于以下两方面的考虑:执行性能缩短API的响应时长,解决批量请求访问超时的问题。在Uwork的业务场景下,一次API批量请求,往往会涉及对另外接口服务的多次调用,而在之前的PHP实现模式下,要做到
Docker最全教程之Go实战,墙裂推荐(十八)
前言 与其他语言相比,Go非常值得推荐和学习,真香!为什么?主要是可以直接编译成机器代码(性能优越,体积非常小,可达10来M,见实践教程图片)而且设计良好,上手门槛低。本篇主要侧重于讲解了Go语言的优势,并且提供了一个推送钉钉消息的Demo。最后由于技
记一次基于ECS搭建Docker环境
基于CentOS 7安装Docker CE(社区版)步骤:
docker入门基本命令
docker基础命令 docker images 查看镜像列表 docker ps a 查看所有docker容器 ,a 指的是所有包括以关闭的容器 docker rm 655e69 删除容器,655e69 指的是容器Id docker rmi nginx:latest 删除镜像 ,:latest为制定版本 docker pull ngin
洞察秋毫——JFrog日志分析 协助监视Docker Hub上的拉取操作
一、背景大家已经注意到,Docker Hub现在开始对镜像拉取进行限制,无论是免费的匿名用户,还是认证用户。在六个小时内,从一个IP地址镜像拉取的请求次数超过固定阈值(匿名用户100次,认证用户200次)后,Docker Hub就会限制其拉取带宽。虽然用户仍然可以拉取到Docker镜像,但是速度要慢得多。您可以阅读我们之前的博客文章《绕开Docker
PaaS失败了吗?让我们看看Cloud Foundry的优势
软件团队常见的行为方式可以总结如下:1. 软件部署从Heroku或Firebase开始。2. 在应用程序需要快速扩展时,开始使用Docker进行容器化。3. 在遇到Docker困境的时候,考虑使用Kubernetes等容器编排工具。(https://cdn.thenewstack.io/media/2020/12/5105a24aimage011.
为什么很多公司都转型go语言开发?Go语言能做什么 ?
Go语言能做什么一、我们为什么选择Go语言选择Go语言的原因可能会有很多,关于Go语言的特性、优势等,我们在之前的文档中也已经介绍了很多了。但是最主要的原因,应该是基于以下两方面的考虑:执行性能缩短API的响应时长,解决批量请求访问超时的问题。在Uwork的业务场景下,一次API批量请求,往往会涉及对另外接口服务的多次调用,而在之前的PHP实现模式下,要做到
TensorFlow Serving
可以快速部署 Tensorflow 模型,上线 gRPC 或 REST API。官方推荐 Docker 部署,也给了训练到部署的完整教程:。本文只是遵照教程进行的练习,有助于了解 TensorFlow 训练到部署的整个过程。 准备环境准备好 ,导入依赖:pyimport sys Confirm that we're using Python 3assert
openGauss——docker安装
写在前面 用 VMware 搭 openGauss 有点点麻烦,百度后发现可以用 docker 直接起,所以再用 docker 搭一遍 搭建 CentOS 7.6步骤同用 VMware 搭建一样,随便搭搭就行 换源输入命令:wget O /etc/yum.repos.d/CentOSBase.repo http://mirrors.aliyun.com/re

热门文章

最新文章