Docker构建时FROM前定义的ARG变量后续引用失效原因咨询
问题根因:Docker ARG 变量的作用域规则限制
Docker 中 ARG 指令的作用域严格按照构建阶段划分:
FROM指令之前定义的ARG属于全局作用域,仅可用于所有FROM行的变量替换,不会自动继承到任何一个构建阶段的内部作用域中- 每个构建阶段(每一个
FROM指令对应一个独立构建阶段)内部定义的ARG,仅在当前阶段内生效,阶段结束后自动失效
对应你的场景:
- 初始写法中,
ARG php_version="7.2"定义在FROM之前,仅在解析拉取基础镜像php:${php_version}-fpm-${flavor}时有效,FROM执行完成后该变量就从当前构建上下文中消失了。后续执行ENV php_v $php_version时,$php_version没有对应值,所以php_v被赋值为空字符串,运行容器时自然输出空。 - 取消
FROM之后的ARG php_version="7.2"注释后,相当于在当前构建阶段内部重新声明了该变量,全局定义的ARG值会被自动继承到该阶段的同名ARG中,后续ENV指令可以正常读取到7.2这个值,因此运行后输出符合预期。
如果不想重复写赋值语句,也可以在 FROM 之后只声明 ARG 不赋值,同样可以读取到全局定义的默认值:
ARG php_version="7.2" ARG flavor="stretch" FROM php:${php_version}-fpm-${flavor} # 仅声明不赋值,会自动继承全局ARG的默认值 ARG php_version ENV php_v $php_version CMD echo $php_v
内容的提问来源于stack exchange,提问作者Shinto C V
相关产品推荐
相关产品推荐

