我的编程空间,编程开发者的网络收藏夹
学习永远不晚
位置:首页-资讯-运维

Dockerfile 中 ARG 的使用与其作用域(Scope)探究

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Dockerfile 中 ARG 的使用与其作用域(Scope)探究

  使用 ARG​ 可以有效的复用 Dockerfile。每次镜像更新,只需要动态的在 build 命令中传入新的参数值即可。

  0x01 结论

  •   在第一个FROM​ 之前的所有 ARG , 在所有 FROM​ 中生效, 仅在 FROM 中生效
  •   在FROM​ 后的 ARG​, 仅在当前 FROM 作用域生效。即尽在当前 阶段 (stage)

  对照组解析

  在随后的 Dockerfile 中, 只定义了一个变量 image​ , 并在 FROM 和 stage

  •   对照组1:stage1​ 和 stage11​ 均在 FROM​ 中使用了变量 $image​: **作用域在所有 FROM 中

  成功拉取FROM $image 并完成 layer 构建

  但是在RUN 中无法正确输出结果,即 image 的值 alpine:3.12

  •   对照组2:stage1​ vs stage2: 作用域在 FROM stage 内部

  在 stage2​ 的作用域中声明了 ARG image,且能正确输出结果。

  •   对照组3: stage2​ vs stage21​: 作用域仅在当前 FROM stage 内部

  虽然 stage2​ 在 stage21​ 上方且声明了 ARG image​, 但 stage21 仍然不能不能正确输出结果。

  0x02 实验过程

  创建 Dockerfile 如下:

  复制

     1.

  2.  ## 在第一个 FROM 之前的所有 ARG , 在所有 FROM 中生效, 仅在 FROM 中生效

  3.  ARG image

      4.

  5.  FROM $image as stage1

  6.  RUN echo "stage1 -> base from image is : $image "

  7.  # result: stage1 -> base from image is :

      8.

  9.  FROM $image as stage11

  10.  RUN echo "stage11 -> base from image is : $image "

  11.  # result: stage11 -> base from image is :

      12.

  13.  FROM alpine:3.12 as stage2

  14.  ## 在 FROM 后的 ARG, 仅在当前 FROM 作用域生效。即尽在当前 阶段 (stage) 生效

  15.  ARG image

  16.  RUN echo "stage2 -> base from image is : $image "

  17.   # stage2 -> base from image is : alpine:3.12

      18.

  19.  FROM alpine:3.12 as stage21

  20.  RUN echo "stage21 -> base from image is : $image "

  21.  # stage21 -> base from image is :

  执行docker build 命令:

  复制

  1.  # docker build --build-arg image=alpine:3.12 --no-cache .

  build 结果展示:

  复制

  1.  Sending build context to Docker daemon 3.072kB

  2.  Step 1/10 : ARG image

  3.  Step 2/10 : FROM $image as stage1

  4.  ---> d6e46aa2470d

  5.  Step 3/10 : RUN echo "stage1 -> base from image is : $image "

  6.  ---> Running in ecb7be5dd9cc

  7.  stage1 -> base from image is : ### image 结果未输出

  8.  Removing intermediate container ecb7be5dd9cc

  9.  ---> 04807c8d53be

  10.  Step 4/10 : FROM $image as stage11

  11.  ---> d6e46aa2470d

  12.  Step 5/10 : RUN echo "stage11 -> base from image is : $image "

  13.  ---> Running in a90e45076345

  14.  stage11 -> base from image is : ### image 结果未输出

  15.  Removing intermediate container a90e45076345

  16.  ---> f2dbce837a1b

  17.  Step 6/10 : FROM alpine:3.12 as stage2

  18.  ---> d6e46aa2470d

  19.  Step 7/10 : ARG image

  20.  ---> Running in 5c8cec4c2f22

  21.  Removing intermediate container 5c8cec4c2f22

  22.  ---> 999d9990bd91

  23.  Step 8/10 : RUN echo "stage2 -> base from image is : $image "

  24.  ---> Running in 4407dcb0e0bb

  25.  stage2 -> base from image is : alpine:3.12 ### image 结果输出

  26.  Removing intermediate container 4407dcb0e0bb

  27.  ---> e5ddd7a84f81

  28.  Step 9/10 : FROM alpine:3.12 as stage21

  29.  ---> d6e46aa2470d

  30.  Step 10/10 : RUN echo "stage21 -> base from image is : $image "

  31.  ---> Running in 64a0a3bb090c

  32.  stage21 -> base from image is : ### image 结果未输出

  33.  Removing intermediate container 64a0a3bb090c

  34.  ---> 82665f9a1037

  35.  Successfully built 82665f9a1037

  0x03 参考文档

  set-build-time-variables—build-arg

  0x04 to be continue

  在以后的时间, 笔者将继续讨论 ARG 在 docker buildx 多节构建时的影响和使用。

  来源: 高薪运维

  >>>>>>点击进入系统运维专题

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Dockerfile 中 ARG 的使用与其作用域(Scope)探究

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Dockerfile 中 ARG 的使用与其作用域(Scope)探究

使用 ARG​ 可以有效的复用 Dockerfile。每次镜像更新,只需要动态的在 build 命令中传入新的参数值即可。
Dockerfile 中 ARG 的使用与其作用域(Scope)探究
2024-04-23

Golang 发展历程中的成功案例与应用领域探究

Golang(Go语言)发展历程中的成功案例与应用领域探究Go语言(简称Golang)是一种由Google开发的开源编程语言,自2009年发布以来逐渐赢得了广泛的关注和应用。Golang的设计目标是提供一种简单、高效、可靠的编程语言,适合
Golang 发展历程中的成功案例与应用领域探究
2024-03-06

探究Go语言中方法与函数的使用方法

go语言提供了方法和函数两种机制来定义可重用代码块。方法用于在特定类型上操作数据,定义时需要显式指定接收者类型,使用点运算符调用。函数用于全局操作,定义与其他编程语言类似,使用括号调用。探究 Go 语言中方法与函数的使用方法简介Go 语
探究Go语言中方法与函数的使用方法
2024-04-03

Shell中变量作用域的介绍与使用命令

前言 众所周知Shell 中的变量只作用于当前进程。如需在子进程中创建副本可使用 export 内建命令。 有时使用临时变量语法可以非常方便。 变量使用任何地方都可以定义 Shell 变量,使用 = 分隔变量名和变量值。= 前后不可出现空格
2022-06-04

比较研究Golang中接口与其他编程语言的使用情况

Golang中接口与其他编程语言的比较研究摘要:接口是编程语言中一种重要的概念,用于实现多态和代码复用。在不同的编程语言中,接口的实现方式和特性有所不同。本文将对Golang中接口的实现方式与其他编程语言进行比较研究,并通过具体的代码示例
比较研究Golang中接口与其他编程语言的使用情况
2024-01-24

编程热搜

  • 人工智能你要知道的那些事
    编程学习网:早在1g时代我们只能接打电话。2g时代可以打电话发短信,玩早期的qq,但网络十分不稳定。3g时代带给我们很大的改变就是宽带上网,视频通话,看视频,听歌玩游戏。那时的人们认为4g无用,认为不会有什么改变,但当4g出来时我们才发现这是一次质的飞跃。
    人工智能你要知道的那些事
  • 人工智能无人机管制到底有多难?
    编程学习网:近日,一段“重庆网红列车遭无人机撞击逼停”的视频,在网络热传。
    人工智能无人机管制到底有多难?
  • 人工智能与人类
    欢迎各位阅读本篇,人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。本篇文章讲述了人工智能与人类,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    人工智能与人类
  • 两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
    公共集群的机器负载分布不均衡的问题,业务的查询和流量不可控等各种各样的问题,要节省机器资源就一定会面对这种各种各样的问题,除非土豪式做法,每个业务都拥有自己的机器资源,这里面有很多很多颇具技术挑战的事情。
    两小时 Elasticsearch 性能优化,直接把慢查询干团灭了……
  • 关于OpenStack的架构详细讲解
    欢迎各位阅读本篇文章,OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。本篇文章讲述了关于OpenStack的架构详细讲解,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    关于OpenStack的架构详细讲解
  • AI &神经网络
    欢迎各位阅读本篇,本篇文章讲述了AI &神经网络,人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。神经网络内容丰富,反映了当前国内外该领域的最新研究成果和动向,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
    AI &神经网络
  • 人工智能对于网络安全的优缺点
    编程学习网:如今,产生的数据比以往任何时候都要多。由于数据分析工具的发展,各行各业的组织都更加重视大数据的收集和存储。
    人工智能对于网络安全的优缺点
  • Bash 初学者系列 7:bash 中的条件语句(if else)
    今天我们介绍一下如何在 bash 中使用条件语句。
    Bash 初学者系列 7:bash 中的条件语句(if else)
  • 人工智能机器学习的重要趋势是什么?
    编程学习网:在竞争日益激烈的技术市场中,从高科技初创公司到全球跨国公司都将人工智能视为关键竞争优势。但是,人工智能行业发展如此之快,以至于很难跟踪最新的研究突破和成就,甚至很难应用科学成果来实现业务成果。
    人工智能机器学习的重要趋势是什么?
  • 人工智能为什么会觉得Matplotlib用起来困难?
    编程学习网:Matplotlib是一个流行的Python库,可以很容易地用于创建数据可视化。
    人工智能为什么会觉得Matplotlib用起来困难?

目录