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
相关产品推荐
相关产品推荐

