You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker多阶段构建中重新声明ARG未被正确识别的问题

多阶段构建中Docker ARG继承的误区

你的问题出在对Docker多阶段构建里ARG的作用范围理解错误:在某个构建阶段内声明的ARG,仅属于当前阶段,不会自动传递到后续阶段。

你在build阶段定义的ARG APP_PATH="/etc/app",这个变量的作用域仅限于build阶段。后续第二阶段重新声明ARG APP_PATH时,因为没有指定默认值,也没有通过构建命令传入参数,所以变量值为空,导致RUN输出空、COPY参数无效。

解决方法

有三种可行的修正方式:

1. 将ARG声明为全局变量

把ARG放在所有FROM指令之前,这样它会成为全局ARG,所有阶段只要重新声明该ARG就能继承其默认值:

ARG APP_PATH="/etc/app"

FROM alpine:latest as build
RUN echo ${APP_PATH}
RUN mkdir -p "${APP_PATH}"

FROM alpine:latest
ARG APP_PATH
RUN echo ${APP_PATH}
COPY --from=build ["${APP_PATH}", "${APP_PATH}"]

2. 在后续阶段重复指定ARG默认值

在第二阶段声明ARG时,指定和build阶段相同的默认值,确保两个阶段使用一致的变量:

FROM alpine:latest as build
ARG APP_PATH="/etc/app"
RUN echo ${APP_PATH}
RUN mkdir -p "${APP_PATH}"

FROM alpine:latest
ARG APP_PATH="/etc/app"
RUN echo ${APP_PATH}
COPY --from=build ["${APP_PATH}", "${APP_PATH}"]

3. 构建时通过命令行传递ARG值

保留你原来的Dockerfile,构建时用--build-arg参数传递变量值,这样两个阶段的ARG都会获取到该值:

docker build -t test --progress=plain --no-cache --build-arg APP_PATH="/etc/app" .

内容的提问来源于stack exchange,提问作者user3366592

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:35:27