如何从Docker最终镜像访问基础镜像添加的文件?
问题原因
你当前的配置无法运行,核心是多阶段构建的用法错误:Dockerfile中连续使用多个FROM指令时,只有最后一个FROM指定的镜像会成为最终镜像的基础,之前FROM base1阶段的文件不会自动继承到ubuntu镜像中,因此执行RUN tar -zxvf myfile.tgz时会提示文件不存在。
解决方法
方法1:通过COPY --from复制前置阶段的文件
给第一个阶段设置别名,然后从该阶段将需要的文件复制到最终的ubuntu镜像中,这是多阶段构建的标准用法:
# 第一阶段:准备文件(使用base1镜像) FROM scratch AS base-stage ADD myfile.tgz . # 第二阶段:构建最终镜像(基于ubuntu) FROM ubuntu # 从base-stage阶段复制myfile.tgz到当前镜像的根目录 COPY --from=base-stage /myfile.tgz / RUN tar -zxvf myfile.tgz
方法2:直接基于base1构建(仅适用于不需要ubuntu环境的场景)
如果你的业务不需要ubuntu的系统环境,可以去掉FROM ubuntu,直接在base1镜像基础上操作:
FROM base1 # 注意:scratch是空白镜像,没有shell和包管理工具,后续RUN指令需要适配该环境
补充说明
- 多阶段构建的优势是可以利用前置阶段生成或存储文件,最终仅将需要的内容复制到最终镜像,有效减少镜像体积。
- 所有需要从前置阶段获取的文件,必须通过
COPY --from=阶段名明确指定复制路径,否则最终镜像不会自动包含前置阶段的内容。
内容的提问来源于stack exchange,提问作者Vinay N Karanth
相关产品推荐
相关产品推荐

