• 首页
  • 狐文
  • 狐图
  • About
狐窝
OvO
  1. 首页
  2. Linux
  3. 正文

Dockerfile多阶段构建镜像

2020年09月09日 31点热度 0人点赞 0条评论

2019-07 from--https://blog.csdn.net/wade3015/article/details/95729492

关于构建镜像最具挑战性的事情之一是保持镜像体积小巧。 Dockerfile 中的每条指令都会在镜像中增加一层,并且在移动到下一层之前,需要记住清除不需要的构件。要编写一个非常高效的 Dockerfile,你通常需要使用 shell 技巧和其它方式来尽可能地减少层数,并确保每一层都具有上一层所需的构件,而其它任何东西都不需要。

Docker是轻量化的,当我们在制作镜像的时候就应该尽量使得应用镜像轻量些,减少镜像的体积。例如一个简单的golang服务,如何构建一个最小的镜像:

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. )
  7. func getNameLen(name string) int {
  8. return len(name)
  9. }
  10. func sayHello(w http.ResponseWriter, r *http.Request) {
  11. message := r.URL.Path
  12. message = strings.TrimPrefix(message, "/")
  13. message = "Hello " + message + " : " + fmt.Sprintf("%d", getNameLen(message))
  14. w.Write([]byte(message))
  15. }
  16. func main() {
  17. http.HandleFunc("/", sayHello)
  18. if err := http.ListenAndServe(":8088", nil); err != nil {
  19. panic(err)
  20. }
  21. }

初学者一般会这样构建:

  1. FROM  golang:latest
  2. MAINTAINER  [email protected]***.com.cn
  3. WORKDIR  /go/src
  4. COPY  .  .
  5. RUN  go  build  –o  myapp
  6. EXPOSE 8088
  7. CMD  [“./myapp”]

这样的构建是可行的,但是golang的基础镜像比较大,所以制作后的镜像体积也大(700M+),我们知道golang的跨平台性,编译好的可执行文件只要在对应的系统中就能运行,那么我们应该将这个编译后得到的可执行文件放到一个更小的镜像中,这样得到的最终镜像就非常的轻量了。

多阶段构建:

在多阶段构建中,您需要在 Dockerfile 中多次使用 FROM 声明。每次 FROM 指令可以使用不同的基础镜像,并且每次 FROM 指令都会开始新阶段的构建。您可以选择将构件从一个阶段复制到另一个阶段,在最终镜像中,不会留下您不需要的所有内容。为了演示这是如何工作的,让我们调整前一节中的 Dockerfile 以使用多阶段构建。

  1. #编译镜像
  2. FROM  golang:latest  as builder
  3. MAINTAINER  [email protected]***.com.cn
  4. WORKDIR  /go/src
  5. COPY  .  .
  6. RUN   go  build  -o  myapp
  7. #产物运行镜像
  8. FROM  alpine:latest
  9. WORKDIR  /root
  10. COPY  --from=builder /go/src/myapp  .
  11. EXPOSE 8088
  12. CMD  [“./myapp”]

简单说下,该 dockerfile 包含了两部分:编译镜像和产物运行镜像,编译镜像跟上边演示的 dockerfile 一样负责生成编译后产物,产物运行镜像通过 COPY --from 语句即可将编译后的产物复制到该镜像内部,最后运行该产物即可。这里提一下,产物运行镜像我采用了 alpine 作为基础镜像,alpine 是一个空镜像,只能用于构建其他镜像,因为它体积很小,提供较小的运行坏境,能够最大限度的减小我们的产物运行镜像大小(当然也可以使用 busybox、scratch等小体积镜像)。

这个Dockerfile构建会生成一个none的中间镜像和一个最终镜像,最终镜像基于alpine镜像,大小只有几十M左右,而生成的中间镜像可以通过docker  system  prune进行回收。

标签: dockerfile 一层 镜像
最后更新:2020年09月09日

OvO

狐狸

点赞
< 上一篇
下一篇 >
最新 热点 随机
最新 热点 随机
钛备份或小米系统备份功能备份出来的APK无法正常还原 BBR安装启用 安装docker mitmproxy 调试方法 Android SDK 版本选择 Perdition Mail代理服务器配置 HAProxy SSL代理 Openssl 中间人SSL代理 Stunnel SSL to SSL代理 NGINX反代IMAP配置 各种设备User Agent Torrent下载工具推荐 用 rar2john+hashcat 破解 RAR 文件密码 2020最好的Linux发行版 关闭新版chrome工具栏上拼图图标 Office 下载、安装、激活,有它就够了! Android 非官方的发行版 openwrt添加autoconf-archive
OpenMediaVault3在Debian 8上的另类安装法 Windows 8.1/Server 2012 R2 也可以 KMS激活了 如何更改安卓屏幕分辨率? nginx配置:location配置方法及实例详解 Debian sid基本配置(从stable/testing升级) Git如何使用代理 基于 FreeBSD 的各类 BSD 发行版 pycharm运行scrapy项目 C++解密Chrome80版本数据库的方法示例代码 在命令行里展示的文本二维码 linux下编译安装glibc Centos7.4源码编译安装GCC7.2.0 一条SQL查询语句的问题 Gmail邮件客户端跳板解决方案 网络爬虫判断页面是否更新 在 Win10 上安装重复数据删除 Sqlite大批量导入数据提高效率的几种方式 mybatis中使用map类型参数,其中key为列名,value为列值
标签聚合
https 密码 chromium ssl blog 下载 yum 网卡 git docker e linux chrome 镜像 路由 安装

COPYRIGHT © 2020 狐窝. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS