dockerfile中多个FROM指令的意义(multistage)

2023-05-16

从docker17.05版本开始,dockerfile中允许使用多个FROM指令(multistage)。这是docker17.05版本的release note:https://docs.docker.com/engine/release-notes/17.05/

这个特性有什么实际的应用场景?最近需要做一个docker镜像,就用到了该特性。简单来说就是可以使编译环境和发布环境分离

使用多FROM指令可以完成多阶段编译。每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中产生的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。

比如下面这种场景:

我们要构建一个c++应用程序的镜像,这个c++程序依赖了很多第三方库,那么我们的构建过程大概如下:

# c++语言环境基础镜像
FROM centos:7.0.3

#安装编译工具,gcc g++ gdb cmake ==

#安装第三方库

# 将源码拷贝到镜像中
COPY project /build/

# 指定工作目录
WORKDIR /build

# 使用make编译代码,生成可执行程序


# 指定容器运行时入口程序 server
ENTRYPOINT ["/build/server"]

这样会导致我们编译出来的镜像非常庞大,而我们最终要用的只是一个可执行程序以及它运行时依赖的动态库,不需要编译工具以及编译时依赖的第三方库的源代码。有了多FROM指令后,我们就可以这样实现这个过程:在基础镜像上安装编译工具->下载第三方库源代码->编译安装第三方库->编译自己的模块代码->将编译好的可执行文件拷贝到新的镜像中->将运行时依赖的动态库拷贝到新镜像中->修改新镜像中的环境变量,使之指向运行时依赖库的位置。dockerfile修改如下:

# c++语言环境基础镜像
FROM centos:7.0.3 AS build_base

#安装编译工具,gcc g++ gdb cmake ==

#安装第三方库

# 将源码拷贝到镜像中
COPY project /build/

# 指定工作目录
WORKDIR /build

# 编译镜像时,运行 make生成可执行程序


# 指定容器运行时入口程序 server
ENTRYPOINT ["/build/server"]

#这里重新启动一个镜像,将编译好的可执行文件和运行依赖库拷贝过来就可以了
FROM centos:7.0.3
COPY --from build_base ***.so .
COPY --from build_base /build/server .
#修改环境变量,使之指向动态库的目录
ENV LD_LIBRARY_PATH=./

我们最终用到的镜像就是最后一个FROM后生成的镜像,前边的FROM只是起到了一个辅助产生编译环境的作用。这也是多FROM特性比较常用的一个场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dockerfile中多个FROM指令的意义(multistage) 的相关文章

随机推荐

  • python 检查变量类型_Python检查变量类型– 3种方式

    python 检查变量类型 In this tutorial we are going to learn how to check variable type in Python 在本教程中 xff0c 我们将学习如何在Python中检查变
  • GO学习每日一题

    注 xff1a 每日一题来源go语言官方公众号 day5 package main import 34 fmt 34 下面这段代码能否通过编译 xff0c 原因 答 xff1a 不能 invalid operation sm1 61 61
  • 用go语言实现查找两个数组的异同

    用go语言实现查找两个数组的异同
  • golang 计算本周周一日期

    func GetThisWeekFirstDate thisMonday int64 now 61 time Now offset 61 int time Monday now Weekday if offset gt 0 offset 6
  • Golang 获取今天和昨天零点的时间

    获取今天和昨天零点的时间 func GetTodayAndYesterdayZroe now 61 time Now today 61 time Date now Year now Month now Day 0 0 0 0 time Lo
  • Golang float64转decimal再加减乘除运算,解决float64数据精度问题

    package main import 34 fmt 34 34 github com shopspring decimal 34 func main x 61 decimal NewFromString 34 1 34 y 61 deci
  • Golang float64保留三位小数

    func prettyFloat64 f float64 n int float64 base 61 10 for i 61 1 i lt n i 43 43 base 61 base 10 inst 61 int64 f float64
  • Golang 计算两个时间相差多少分钟

    stime int64 etime int64 时间戳 starttime 61 time Unix stime 0 endtime 61 time Unix etime 0 costtime 61 decimal NewFromFloat
  • Spring自动配置原理

    文章目录 一 概念二 自动配置原理二 自动配置生效总结 一 概念 spring集成其他框架中 xff0c 需要编写大量的xml配置文件 xff0c 编写这些配置文件十分繁琐 xff0c 常常出行错误 xff0c 导致开发效率低 Spring
  • centos 上容器配置X11

    系统 xff1a centos 7 9 连接工具 xff1a 同一个局域网内win10电脑上安装的MobaXterm Personal 步骤 xff1a 找到对应的包 96 yum whatprovides xhost 安装yum y in
  • Java 实现线程安全的方式

    1 创建线程的三种方式 通过实现 Runnable 接口 xff1b 通过继承 Thread 类本身 xff1b 通过 Callable 和 Future 创建线程 2 线程的生命周期 新建状态 使用 new 关键字和 Thread 类或其
  • 生产者消费者问题c语言_C中的生产者消费者问题

    生产者消费者问题c语言 Here you will learn about producer consumer problem in C 在这里 xff0c 您将了解C语言中的生产者消费者问题 Producer consumer probl
  • 2.15多生产者多消费者问题

    视频链接 xff1a https www bilibili com video BV1YE411D7nH p 61 24 一 xff0c 问题描述 桌上有一只盘子 xff0c 每次只能向其中放入一个水果 爸爸向盘子中只放苹果 xff0c 妈
  • 【已解决】xterm: Xt error: Can‘t open display:

    项目场景 xff1a 在MobaXterm中 xff0c 使用Ubuntu 18 04的gdb来debug MPI并行的C 43 43 代码 问题描述 Debug时 xff0c 输入 mpiexec span class token ope
  • mariadb安装

    1 配置官方的mariadb的yum源 手动创建 mariadb repo仓库文件 touch etc yum repos d mariadb repo 然后写入如下内容 mariadb name 61 MariaDB baseurl 61
  • Java 给某段代码加超时时间

    问题原因 xff1a 使用HuTool 的DbTtil 不能设置数据库连接超时时间 xff0c 可能数据库挂了 xff0c 会导致连接一直卡在那 xff0c 也没有异常抛出 xff0c 导致线程一直占着 所以给该段代码加超时时间处理 spa
  • 使用reserve来避免不必要的内存重新分配

    STL容器的内存分配策略是 xff0c 他们会自动增长以便容纳下你放入其中的数据 xff0c 只要没有超过它的最大限制就可以 xff08 要查看最大限制可调用名为max size的成员函数 xff09 对于vector和string xff
  • zmq发布-订阅模式c++实现

    上一篇讲到zmq的安装及简单的请求 应答模式 xff0c 本篇主要来看一下zmq的pub sub代码如何实现 发布 订阅模式的特点 xff1a 1 一个发布者可以被多个订阅者订阅 xff0c 即发布者和订阅者是1 xff1a n的关系 2
  • git commit之后如何撤销

    git正常提交代码的的操作为 xff1a git add 将本地的所有文件改变添加至暂存区 git commit m 34 fix xx update xx 34 进行commit的提交 git push 推送到远端仓库 如果在git co
  • dockerfile中多个FROM指令的意义(multistage)

    从docker17 05版本开始 xff0c dockerfile中允许使用多个FROM指令 multistage 这是docker17 05版本的release note xff1a https docs docker com engin