以alpine镜像为基础将go应用部署在docker中

louhangfei · · 2738 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

当用docker进行部署go应用时,我们可以选择docker中的golang镜像。

但为了更快的启动速度和更小的磁盘占用,我们推荐以alpine镜像作为基础镜像。
Alpine 操作系统采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。

Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB)

有人可能会有疑问:为什么可以采用alpine镜像呢?alpine镜像不是没有go环境吗?

你的疑问是对的。alpine的确没有go环境。但是我们可以在编译机器中预先将代码编译成一个二进制文件,然后将该二进制文件在ADD到新的镜像中。该二进制文件的执行不依赖于go环境了,所以我们可以直接将它在alpine环境中跑起来。

但是编译成alpine版本的过程与其他linux如centos,过程稍有不同。
centos中编译:

go build main.go

但是编译成alpine版本则需要加

CGO_ENABLED=0 go build main.go

CGO_ENABLED
默认情况下,Go的runtime环境变量CGO_ENABLED=1,即默认开始cgo,允许你在Go代码中调用C代码。通过设置CGO_ENABLED=0就禁用CGO了。
Dockerfile文件内容

FROM docker.io/alpine
ADD ./golang/src/pro/main /go/main
EXPOSE 9000
CMD /go/main     

通过dockerfile编译go的代码成的镜像仅有12.3M,当然这也取决于你的代码包大小.
制作镜像代码。

docker build -f golang/Dockerfile -t mygo11 .

-f指定Dockerfile文件。最后面的.指定当前制作镜像的上下文。这个上下文和Dockerfile的ADD ./golang/src/pro/main /go/main 中第一个路径有关系。如果上下文不对的话,那么ADD时会找不到对应的路径而制作镜像失败。这里很关键。最好是将上下文和Dockerfile文件在同一目录。我这里为了学习上下文故意设置成不一样而已。

启动容器

docker run -d -p 9004:9000 mygo11

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:louhangfei

查看原文:以alpine镜像为基础将go应用部署在docker中

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2738 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传