持续构建:使用Docker镜像方式构建go语言项目
发布日期:2021-06-30 20:16:21 浏览次数:2 分类:技术文章

本文共 4247 字,大约阅读时间需要 14 分钟。

在这里插入图片描述

go官方提供了各种版本的镜像,在Easypack中根据官方的Alpine镜像也创建go语言的镜像,因为go 1.13开始GOPROXY 默认为 https://proxy.golang.org,将GOPROXY缺省设定为goproxy.cn,以方便更简单地使用go镜像进行构建。

golang官方镜像

官方镜像分如下三类:

  • 普通镜像:golang:<version>
  • Alpine镜像:golang:<version>-alpine
  • Windows镜像:golang:<version>-windowsservercore
    详细可参看:https://hub.docker.com/_/golang

Easypack的Alpine镜像

镜像tag:golang:<version>-alpine

下载镜像

下载镜像:docker pull liumiaocn/golang:1.13.5-alpine3.11

在这里插入图片描述

编译go语言应用

这里以Prometheus提供的go语言的示例应用(为Prometheus提供可供抓取的数据)为例进行说明如何使用Docker镜像进行go语言应用的编译。

准备go语言应用

执行命令:git clone https://github.com/prometheus/client_golang.git

当然也可以直接使用自己手头已有的go语言的应用示例进行编译。

启动Docker容器

启动Docker并将待编译的工程进行卷的映射

执行命令示例:docker run --rm -it -v `pwd`/client_golang:/project liumiaocn/golang:1.13.5-alpine3.11 sh

liumiaocn:golang liumiao$ docker run --rm -it -v `pwd`/client_golang:/go/src liumiaocn/golang:1.13.5-alpine3.11 sh/go # lsbin  src/go # cd src/go/src # lsCHANGELOG.md     LICENSE          Makefile.common  VERSION          go.modCONTRIBUTING.md  MAINTAINERS.md   NOTICE           api              go.sumDockerfile       Makefile         README.md        examples         prometheus/go/src #

构建名为ruandom的应用

此示例工程下有如下go语言的应用,我们对其进行编译

/go/src # cd examples/random//go/src/examples/random # lsmain.go/go/src/examples/random #
  • 下载依赖包
/go/src/examples/random # go get -dgo: downloading github.com/prometheus/common v0.7.0go: downloading github.com/prometheus/client_model v0.1.0go: downloading github.com/prometheus/procfs v0.0.8go: downloading golang.org/x/sys v0.0.0-20191220142924-d4481acd189fgo: downloading github.com/beorn7/perks v1.0.1go: downloading github.com/cespare/xxhash/v2 v2.1.1go: downloading github.com/golang/protobuf v1.3.2go: extracting github.com/prometheus/common v0.7.0go: extracting github.com/prometheus/client_model v0.1.0go: downloading github.com/matttproud/golang_protobuf_extensions v1.0.1go: extracting github.com/cespare/xxhash/v2 v2.1.1go: extracting github.com/golang/protobuf v1.3.2go: extracting github.com/beorn7/perks v1.0.1go: extracting github.com/prometheus/procfs v0.0.8go: extracting github.com/matttproud/golang_protobuf_extensions v1.0.1go: extracting golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go/src/examples/random #
  • 构建应用
/go/src/examples/random # go buildgo: finding github.com/prometheus/client_model v0.1.0go: finding github.com/prometheus/common v0.7.0go: finding github.com/beorn7/perks v1.0.1go: finding github.com/cespare/xxhash/v2 v2.1.1go: finding github.com/golang/protobuf v1.3.2go: finding github.com/prometheus/procfs v0.0.8go: finding github.com/matttproud/golang_protobuf_extensions v1.0.1/go/src/examples/random #
  • 构建结果确认
/go/src/examples/random # lsmain.go  random/go/src/examples/random #

可以看到已经构建了一个名为random的可执行文件, 至此已经确认完毕。确认main.go就会发现实际上此应用就是在指定端口的/metrics的URL上提供一些随机的指标数据,比如这里在8080端口启动此应用。

/go/src/examples/random # ./random -listen-address=:8080 &/go/src/examples/random # psPID   USER     TIME  COMMAND    1 root      0:00 sh  203 root      0:00 ./random -listen-address=:8080  211 root      0:00 ps/go/src/examples/random #

由于此镜像也是在官方Alpine镜像基础上作出的,缺省未安装curl,此处为了验证手动添加一下

/go/src/examples/random # apk add curlfetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gzfetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz(1/3) Installing nghttp2-libs (1.40.0-r0)(2/3) Installing libcurl (7.67.0-r0)(3/3) Installing curl (7.67.0-r0)Executing busybox-1.31.1-r8.triggerOK: 7 MiB in 18 packages/go/src/examples/random #

动作确认

/go/src/examples/random # curl http://localhost:8080/metrics 2>/dev/null |head -n 15# HELP go_build_info Build information about the main Go module.# TYPE go_build_info gaugego_build_info{checksum="",path="github.com/prometheus/client_golang",version="(devel)"} 1# HELP go_gc_duration_seconds A summary of the GC invocation durations.# TYPE go_gc_duration_seconds summarygo_gc_duration_seconds{quantile="0"} 0go_gc_duration_seconds{quantile="0.25"} 0go_gc_duration_seconds{quantile="0.5"} 0go_gc_duration_seconds{quantile="0.75"} 0go_gc_duration_seconds{quantile="1"} 0go_gc_duration_seconds_sum 0go_gc_duration_seconds_count 0# HELP go_goroutines Number of goroutines that currently exist.# TYPE go_goroutines gaugego_goroutines 10/go/src/examples/random #

所以可以看出构建出来的应用是可以正常动作的。

转载地址:https://liumiaocn.blog.csdn.net/article/details/103778750 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:持续构建:Alpine镜像下构建的Go语言应用的运行问题
下一篇:Android应用构建:error when loading shared libraries libstdc++.so.6的对应

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年05月03日 17时47分11秒