当前位置: 首页 > 科技观察

探索ARG在Dockerfile中的使用及其作用域(Scope)

时间:2023-03-21 12:05:55 科技观察

使用ARG可以有效的复用Dockerfile。每次更新镜像,只需要在构建命令中动态传入新的参数值即可。0x01结论第一个FROM之前的所有ARG在所有FROM中都有效,并且只在FROM中有效。FROM之后的ARG只在当前FROM作用域内有效。即只在当前阶段(stage)控制组分析在后续的Dockerfile中,只定义了一个变量image,而在FROM和stage控制组1中:stage1和stage11都使用了FROM中的变量$image:**scope在所有FROM中成功拉取FROM$image并完成层构建,但在RUN中无法正确输出结果,即imagealpine:3.12controlgroup2:stage1vsstage2:thescope的值在FROMstage里面ARGimage声明在stage2的范围内,结果可以正确输出。对照组3:stage2vsstage21:范围仅在当前FROM阶段内。虽然stage2在stage21之上,声明了ARGimage,但stage21仍然无法正确输出结果。0x02实验过程创建Dockerfile如下:##第一个FROM之前的所有ARG在所有FROM中生效,只有ARG在FROM中生效imageFROM$imageasstage1RUNecho"stage1->basefromimageis:$image"#结果:stage1->basefromimageis:FROM$imageasstage11RUNecho"stage11->basefromimageis:$image"#result:stage11->basefromimageis:FROMalpine:3.12asstage2##afterFROMARG,只在当前FROM范围内生效。ARGimageRUNecho"stage2->basefromimageis:$image"#stage2->basefromimageis:alpine:3.12FROMalpine:3.12asstage21RUNecho"stage21->basefromimageis:$image"#stage21->复制代码basefromimageis:Executethedockerbuildcommand:#dockerbuild--build-argimage=alpine:3.12--no-cache.buildresultdisplay:SendingbuildcontexttoDockerdaemon3.072kBStep1/10:ARG图像第2步/10:FROM$imageasstage1--->d6e46aa2470dStep3/10:RUNecho"stage1->basefromimageis:$image"--->Runninginecb7be5dd9ccstage1->basefromimageis:###image的结果未输出删除中间容器ecb7be5dd9cc--->04807c8d53be步骤4/10:从$imageasstage11--->d6e46aa2470dStep5/10:RUNecho"stage11->basefromimageis:$image"--->在a90e45076345stage11中运行->来自图像的基础是:###图像结果未输出删除中间容器a90e45076345--->f2dbce837a1bStep6/10:FROMalpine:3.12asstage2--->d6e46aa2470dStep7/10:ARGimage--->Runningin5c8cec4c2f22Removingintermediatecontainer5c8cec4c2f22--->999d9990bd91Step8/10:RUNecho"stage2->is$imagefrom-->Runningin4407dcb0e0bbstage2->basefromimageis:alpine:3.12###imageoutput删除中间容器4407dcb0e0bb--->e5ddd7a84f81Step9/10:FROMalpine:3.12asstage21--->d6e46aStep4:RUNecho"stage21->basefromimageis:$image"--->Runningin64a0a3bb090cstage21->basefromimageis:###image结果不输出Removingintermediatecontainer64a0a3bb090c--->82665f9a1037Successfullybuilt-813037f9Reference0abuild-time-variables—build-arg0x04稍后继续,笔者将继续讨论arg在dockerbuildxmulti-sectionbuild中的影响和使用