Dockerfile中COPY --from指令引用ARG变量不生效问题求助
问题原因
你收到的报错invalid from flag value test/test-library:${BUILD_CONFIG}: invalid reference format翻译为:--from参数值test/test-library:${BUILD_CONFIG}非法:镜像引用格式错误。
该问题的根源是Docker对不同指令的ARG变量作用域规则不同:
- Docker在解析镜像引用(包括
FROM指定基础镜像、COPY --from指定外部镜像)时,只会读取声明在所有FROM指令之前的全局ARG变量 - 你将
ARG BUILD_CONFIG=dev写在了FROM之后,属于当前构建阶段的局部ARG,仅对RUN、ENV这类阶段内执行的指令生效,因此RUN echo能正常打印变量值,但解析COPY --from的镜像名时完全识别不到这个变量,会把${BUILD_CONFIG}当做纯字符串处理,最终导致镜像标签格式非法。
解决方案
无需创建额外的重复构建阶段,只需将BUILD_CONFIG的ARG声明移到整个Dockerfile的最开头(第一个FROM之前)即可:
# 声明为全局ARG,所有阶段解析镜像引用时均可生效 ARG BUILD_CONFIG=dev FROM node:12.15.0 as prod # 阶段内执行指令可直接使用该全局ARG,无需重复声明 RUN echo ${BUILD_CONFIG} COPY --from=test/test-library:${BUILD_CONFIG} /work/dist /work/library/dist CMD [ "bash" ]
补充说明
- 若需要在构建时覆盖默认配置,执行
docker build --build-arg BUILD_CONFIG=prod .即可正常生效 - 多阶段构建场景下,该全局ARG对所有阶段的
FROM、COPY --from的镜像引用解析均生效
内容的提问来源于stack exchange,提问作者Eskarion
相关产品推荐
相关产品推荐

