为何Dockerfile中FROM指令后无法复用之前定义的构建参数?
为什么Docker构建参数在FROM指令后无法复用?
你遇到的这个问题核心在于Docker构建参数(ARG)的作用域是按构建阶段划分的,FROM指令会触发一个新的构建阶段,之前定义的ARG不会自动延续到这个阶段中。
具体原因拆解:
- 在Dockerfile里,
FROM是构建阶段的边界。在FROM之前定义的ARG,只能用于FROM指令本身(比如指定基础镜像)。一旦执行完FROM进入后续的构建步骤,这个阶段的上下文里就不再包含之前定义的ARG了。 - 你的第一个示例中,
ARG FROM_IMAGE=ubuntu:bionic是在FROM之前声明的,所以FROM $FROM_IMAGE能正常解析基础镜像。但到了COPY步骤时,$FROM_IMAGE已经是未定义的状态(相当于空字符串),实际执行的命令变成了COPY sources_list/ /etc/apt/sources.list——把整个sources_list目录复制到/etc/apt/sources.list这个文件路径上,自然会报“不是目录”的错误。
为什么第二个示例能正常工作?
当你在FROM之后重新声明ARG SOURCES_LIST_FILE时,相当于在当前构建阶段重新引入了这个参数(不管是通过--build-arg传递值,还是使用默认值),后续的COPY指令就能正常访问到它的值了。
如果想复用原来的FROM_IMAGE参数名,你只需要在FROM之后重新声明一次即可,甚至可以保留默认值:
ARG FROM_IMAGE=ubuntu:bionic FROM $FROM_IMAGE ARG FROM_IMAGE=ubuntu:bionic # 重新声明,将参数带入当前构建阶段 COPY sources_list/$FROM_IMAGE /etc/apt/sources.list
额外说明
Docker的这种设计是为了隔离不同构建阶段的参数环境,避免跨阶段的参数意外干扰。每个FROM指令都会启动一个独立的构建阶段,每个阶段的ARG都是独立的,必须显式重新声明才能在阶段内使用。
内容的提问来源于stack exchange,提问作者gertvdijk
相关产品推荐
相关产品推荐

