Docker最全教程——从理论到实战(十六)
前言
与其他语言相比,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语言编写。由于以上一些特性,Go特别适合云计算相关服务开发(关于这一点,大家可以关注各大云厂商的开源项目)、服务器编程、分布式系统、网络编程、内存数据库等等。

官方镜像
官方镜像地址:
https://hub.docker.com/_/golang
由于爹好,所以官方文档比较详细:

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

使用Go推送钉钉消息
接下来,我们使用Go编写一个简单的Demo:即通过钉钉机器人WebHooks推送消息到钉钉。
目前钉钉已经普遍应用于办公领域,通过对接钉钉机器人,我们可以将一些希望相关团队关注的信息推送到相应的钉钉群。
了解钉钉机器人
在开始之前,我们需要对钉钉机器人有个大致的了解:
https://open-doc.dingtalk.com/microapp/serverapi2/qf2nxq
这里我们是使用自定义机器人。当前自定义机器人支持文本 (text)、连接 (link)、markdown (markdown)、ActionCard、FeedCard消息类型,我们可以根据自己的使用场景选择合适的消息类型,达到最好的展示样式。例如我们用的比较多的是markdown类型:

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

从环境变量获取参数
我们可以通过环境变量来传参。
定义环境变量参数:

//环境变量
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"
)

关键代码如下所示:


设置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

编译出来的镜像非常小,使用了分阶段构建,因为alpine的镜像非常小,而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用于自动清理。也就是用之即来,用完即走。
推送成功后,效果图如下所示:


写到这里,笔者有些技痒了!!于是准备试试使用.NET Core也编写类似代码,下节内容将持续更新,敬请关注!
作者:雪雁
出处:http://www.cnblogs.com/codelove/
Docker最全教程——从理论到实战(十六)的更多相关文章
- Docker最全教程——从理论到实战(六)
托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅. 自建还是托管? 在开始之前,我们先来讨论一个问题——是自建 ...
- Docker最全教程——从理论到实战(八)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战(七)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- Docker最全教程——从理论到实战
Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) Docker最全教程—— ...
- Docker最全教程——从理论到实战(五)
往期内容链接 Docker最全教程——从理论到实战(一) Docker最全教程——从理论到实战(二) Docker最全教程——从理论到实战(三) Docker最全教程——从理论到实战(四) 本篇教程持 ...
- Docker最全教程——从理论到实战(一)
容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本篇教程持续编写了2个星期左右,只是为了大家更好地了解.理解和消化这个技术,能够搭上这波车. 你 ...
- Docker最全教程---从理论到实战
目录 前言 随着生产力的发展尤其是弹性架构的广泛应用(比如微服务),许多一流开发者都将应用托管到了应用容器上,比如Google.微软.亚马逊.腾讯.阿里.京东和新浪. 从未来的发展方向来看,容器引擎将 ...
- Docker最全教程——从理论到实战(二十二)
前言 最近正在抽时间编写k8s的相关教程,很是费时,等相关内容初步完成后,再和大家分享.对于k8s,还是上云更为简单.稳定并且节省成本,因此我们需要对主流云服务的容器服务进行了解,以便更好地应用于生产 ...
- Docker最全教程——从理论到实战(十五)
前言 Java是一门面向对象的优秀编程语言,市场占有率极高,但是在容器化实践过程中,发现官方支持并不友好,同时与其他编程语言的基础镜像相比(具体见各语言镜像比较),确实是非常臃肿. 本篇仅作探索,希望 ...
- Docker最全教程——从理论到实战(四)
往期内容链接 https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608. ...
随机推荐
- k8s系列----索引
day1:k8s集群准备搭建和相关介绍 day2:k8spod介绍与创建 day3:k8sService介绍及创建 day4:ingress资源和ingress-controller day5:存储卷 ...
- for遍历用例数据时,报错:TypeError: list indices must be integers, not dict,'int' object is not iterable解决方法
一:报错:TypeError: list indices must be integers, not dict for i in range(0,len(test_data)): suite.addT ...
- SpringCloud学习之—Eureka集群搭建
Eureka集群的搭建 上次说过了在SpringCloud应用中使用Eureka注册中心,用来对服务提供者进行服务注册与发现,但同时,它也是一个"微服务",单个应用使用空间有限,因 ...
- CSS中的圣杯布局与双飞翼布局
一,圣杯布局 1,什么是圣杯布局? 所谓圣杯布局就是用于实现一个两侧宽度固定,中间宽度自适应的三栏布局 2,构建圣杯布局的步骤: 2.1,添加一个容器,在这个容器中添加放三个盒子(左.中.右): 2. ...
- HTML连载69-透视属性以及其他属性练习
一.透视属性 1.什么是透视 透视简单来说就是近大远小 2.注意点:一定要注意,透视属性必须添加到需要呈现近大远小效果的元素的父元素. 3.格式:perspective:数字px; 这里的数字代 ...
- 1.4掌握日志工具的使用——Android第一行代码(第二版)笔记
Android中的日志工具类是Log(android.util.Log),这个类中提供了如下5个方法来供我们打印日志. Log.v():用于打印那些最为琐碎的.意义最小的日志信息.对应级别verbos ...
- redis 5.0.7 源码阅读——跳跃表skiplist
redis中并没有专门给跳跃表两个文件.在5.0.7的版本中,结构体的声明与定义.接口的声明在server.h中,接口的定义在t_zset.c中,所有开头为zsl的函数. 一.数据结构 单个节点: t ...
- linux中shell内置命令和外置命令
shell内置命令 无法通过which或者whereis去查找命令的位置 例如cd,cp这些命令是shell解释器内置的命令 当shell内置命令传入shell解释器,shell解释器通过内核获取相关 ...
- View Binding初探
参考翻译:https://developer.android.google.cn/topic/libraries/view-binding View Binding是一项功能,使您可以更轻松地编写与视 ...
- Git 学习文档
Study Document for Git Git 基础 Git 文件的三种状态: 已提交(committed).已修改(modified)和已暂存(staged). Git 工作目录的状态: 已跟 ...