上期的文章:Kubernetes入门实践--部署运行Go项目发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。

Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占太多篇幅。

确实线上项目的应用镜像一般都不像之前文章里讲的那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先用Docker容器把项目编译成二进制文件,然后把编译好的文件拷贝到一个新的容器镜像里,新镜像里一般只包含Linux系统运行需要的最基本的文件,不需要有Go环境,因此能减少很多占用空间。整个这个过程都发生在镜像构建的过程中,这样就能保证多环境的一致性,上面这个构建Docker镜像的方式叫做多阶段构建(multi stage build)。

多阶段构建是17.05版本才有的功能,所以使用前要先确定下使用的Docker Engine的版本。

Docker Engine版本

下面就来介绍一下怎么使用Docker的多阶段构建制作Go应用的镜像。

之前文章Kubernetes入门实践--部署运行Go项目里镜像的Dockerfile长这样:

FROM golang:1.14-alpine
RUN mkdir /app
COPY . /app
WORKDIR /app
RUN go build -o main .
CMD ["/app/main"]

我们使用多阶段构建的方式构建镜像后,Dockerfile会变成类似下面这样:

FROM golang:alpine AS buildRUN mkdir /app
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp###
FROM scratch as final
COPY --from=build /app/myapp .
CMD ["/myapp"]

Go项目应用的Dockerfile通常大概类似这样,但是每个项目的细节可能有所不同。FROM golang:alpine指定了开始阶段的基础映像(其中包含Go工具和库,用于构建程序),AS build是给这个阶段取名为build

golang:alpine指定了Go基础映像的alpine版本, alpine是专门为容器设计的小型Linux发行版。这个Dockerfile中使用了两次FROM指令,第二条FROM scratch行,它告诉Docker从一个全新的,完全空的容器镜像重新开始,然后将上个阶段编译好的程序复制到其中。这个才是我们随后将用于运行的Go应用程序的容器镜像。

scratch镜像是Docker项目预定义的最小的镜像。使用scratch镜像可以节省大量空间,因为我们实际上不需要Go工具或其他任何东西来运行我们的编译好的程序,这可能也是Go在容器时代的一个优势吧。

使用scratch镜像制作的Go应用镜像在运行时会有一个不识别时区的问题。这个也是我们最近项目往Kubernetes上迁移时遇到的第一个问题,不过还好经过Google和查看Go加载系统时区的源码我帮新来的运维小哥哥找到了解决方法,具体怎么解决的下期的文章再告诉大家。

容器和虚拟机到底有啥区别?

Minikube-笔记本上的Kubernetes集群

❤️爱心三连

1.看到这里了就点个在看支持下吧,你的「在看」是我创作的动力。

2.关注公众号网管叨bi叨,「每周为您分享原创技术文章」!

3.特殊阶段,带好口罩,做好个人防护。

“在看转发”是最大的支持

线上Go项目的Docker镜像应该怎么构建?相关推荐

  1. Docker 镜像多阶段构建实战总结

    文章目录 Docker 镜像多阶段构建实战总结 一 背景 二 实践步骤 2.1 只通过一个 Dockerfile 来构建[方案一] 2.2 多个 Dockerfile 实现多阶段构建[方案二] 2.3 ...

  2. Windows7上安装TensorFlow——基于Docker镜像

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.当你通过 Docker 安装和运行 Ten ...

  3. 史上最详细的Docker 镜像的制作-上传-拉取--部署(阿里云)

    Docker 镜像的制作-上传-拉取--部署 一.镜像(images) 1. 什么是镜像? 2. 镜像的组成和用途 (1)Dockerfile (2)scratch (3)一个完整的操作系统需要: 3 ...

  4. Docker最全总结,DockerFile,Docker编排容器,Docker镜像,Docker-compose构建

    文章目录 Docker 简介 为什么使用docker: Docker引擎: Docker系统镜像: Docker容器: Docker仓库: ubuntu安装docker: ubuntu脚本自动安装: ...

  5. Docker镜像的三大构建方式

    摘要 在构建容器化应用时,相当重要的步骤莫过于镜像制作,本文将介绍镜像制作方法以及镜像制作的建议. 采用docker commit生成的镜像实际上是容器内的文件系统进行修改在进行提交,而运行的容器实际 ...

  6. python对于图片的风格的处理--引用github上开源项目的

    2019独角兽企业重金招聘Python工程师标准>>> 关于python做过的比较好玩的事 这段时间学了python,对于python这种优雅简洁的语言深深吸引,在网上看到一个git ...

  7. 怎么把一个Java应用打包成Docker镜像

    怎么把Java应用打包成Docker镜像?对熟悉Docker的同学这应该是一个很简单的问题,把项目打包成JAR包然后在Dockerfile里用ADD命令把JAR文件放到镜像里,启动命令设置执行这个JA ...

  8. maven项目中如何直接访问某一个页面_整一个自己的docker镜像

    获取镜像的途径有两个,一是从镜像仓库获取,如官方的Docker Hub,二是自定义.上文已经介绍如何从镜像仓库获取镜像,本文基于一个Springboot项目,来介绍自定义一个镜像的基本流程. 1. 定 ...

  9. 实战Spring Boot 2.0系列(一) - 使用Gradle构建Docker镜像

    前言 通常我们使用 Dockerfile 来构建项目的 Docker 镜像.但是也有使用 gradle 在编译项目的时候一起把镜像给 构建 并 上传 的需求.本文将会讲解如何使用 gradle 编写并 ...

最新文章

  1. AI十年进阶:一段算法能力演进的历史
  2. munin监控windos机子
  3. information_schema中的所有表和视图
  4. 《数据库原理与应用》(第三版)第2章 数据模型与数据库结构 习题参考答案
  5. android cad 开源库,KiCad 开源元件库收集
  6. 电子书下载:Silverlight 5 in Action
  7. Java计基础---常用类之StringBuilder类--String、StringBuilder和StringBuffer 的区别
  8. 上传txt生成字典 java_文件上传漏洞fuzz字典生成脚本小工具分享
  9. php dir()函数的用法
  10. 树莓派系统的安装、初步配置与远程访问
  11. easyui截取后缀名
  12. 从零实现深度学习框架——神经网络入门
  13. C++学习之继承篇(is a:用子类对象给基类对象赋值或初始化)
  14. 第12章 正则表达式与文件格式化处理
  15. Python开发第一步的环境搭建
  16. 计算机服务怎么打开flash,快速讲解Win10自带的浏览器如何开启Adobe Flash?
  17. 分享133个JSP源码,总有一款适合你
  18. 计算机访学面试,访学申请Skype面试经历
  19. 辟谣!微信支付宝收款码将不能用于经营性收款?
  20. 蓝桥杯 2014-2 切面条

热门文章

  1. Javascript中的form
  2. 【转】C#获取当前日期时间(转)
  3. 安卓学习UI组件-ViewFlipper-实现屏幕切换动画效果
  4. Iphone开发-NSdata 与 NSString,Byte数组,UIImage 的相互转换
  5. 纯MASM32打造BootClos——查看、备份系统开关机记录(0.0.0001 beta1,9KB)
  6. Kafka测试1.0.0
  7. 洛谷——P1109 学生分组
  8. Debian 7.8 通过 apt-get 安装 nodejs
  9. C#水晶报表,窗体不显示,闪退
  10. Git学习(4)基本操作