前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Dockerfile 中 ARG 的使用与其作用域(scope)探究

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

作者头像
老麦
发布2022-12-24 10:28:38
5710
发布2022-12-24 10:28:38
举报
文章被收录于专栏:Go与云原生Go与云原生

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

0x01 结论

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

对照组解析

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

  1. 对照组1: stage1stage11 均在 FROM 中使用了变量 $image: **作用域在所有 FROM
    • 成功拉取 FROM $image 并完成 layer 构建
    • 但是在 RUN 中无法正确输出结果,即 image 的值 alpine:3.12
  2. 对照组2: stage1 vs stage2: 作用域在 FROM stage 内部
    • stage2 的作用域中声明了 ARG image,且能正确输出结果。
  3. 对照组3: stage2 vs stage21: 作用域仅在当前 FROM stage 内部
    • 虽然 stage2stage21 上方且声明了 ARG image, 但 stage21 仍然不能不能正确输出结果。

0x02 实验过程

  1. 创建 Dockerfile 如下
代码语言:javascript
复制

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

FROM $image as stage1
RUN echo "stage1 -> base from image is : $image "
    # result: stage1 -> base from image is :

FROM $image as stage11
RUN echo "stage11 -> base from image is : $image "
    # result: stage11 -> base from image is :

FROM alpine:3.12 as stage2
## 在 FROM 后的 ARG, 仅在当前 FROM 作用域生效。即尽在当前 阶段 (stage) 生效
ARG image
RUN echo "stage2 -> base from image is : $image "
    # stage2 -> base from image is : alpine:3.12

FROM alpine:3.12 as stage21
RUN echo "stage21 -> base from image is : $image "
    # stage21 -> base from image is :


  1. 执行 docker build 命令
代码语言:javascript
复制
# docker build --build-arg image=alpine:3.12 --no-cache .
  • build 结果展示
代码语言:javascript
复制
Sending build context to Docker daemon  3.072kB
Step 1/10 : ARG image
Step 2/10 : FROM $image as stage1
 ---> d6e46aa2470d
Step 3/10 : RUN echo "stage1 -> base from image is : $image "
 ---> Running in ecb7be5dd9cc
stage1 -> base from image is :  ### image 结果未输出
Removing intermediate container ecb7be5dd9cc
 ---> 04807c8d53be
Step 4/10 : FROM $image as stage11
 ---> d6e46aa2470d
Step 5/10 : RUN echo "stage11 -> base from image is : $image "
 ---> Running in a90e45076345
stage11 -> base from image is :       ### image 结果未输出
Removing intermediate container a90e45076345
 ---> f2dbce837a1b
Step 6/10 : FROM alpine:3.12 as stage2
 ---> d6e46aa2470d
Step 7/10 : ARG image
 ---> Running in 5c8cec4c2f22
Removing intermediate container 5c8cec4c2f22
 ---> 999d9990bd91
Step 8/10 : RUN echo "stage2 -> base from image is : $image "
 ---> Running in 4407dcb0e0bb
stage2 -> base from image is : alpine:3.12     ### image 结果输出
Removing intermediate container 4407dcb0e0bb
 ---> e5ddd7a84f81
Step 9/10 : FROM alpine:3.12 as stage21
 ---> d6e46aa2470d
Step 10/10 : RUN echo "stage21 -> base from image is : $image "
 ---> Running in 64a0a3bb090c
stage21 -> base from image is :      ### image 结果未输出
Removing intermediate container 64a0a3bb090c
 ---> 82665f9a1037
Successfully built 82665f9a1037

0x03 参考文档

  • set-build-time-variables—build-arg

0x04 to be continue

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 熊猫云原生Go 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 结论
    • 对照组解析
    • 0x02 实验过程
    • 0x03 参考文档
    相关产品与服务
    容器镜像服务
    容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档