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

Docker构建中使用VOLUME时下载文件消失的原因是什么?

Why does VOLUME /tmp make my downloaded file disappear in subsequent RUN commands?

这问题的根源其实是Docker对VOLUME指令的特殊处理逻辑,我来给你掰扯清楚:

当你在Dockerfile里声明VOLUME /tmp之后,从这条指令开始,所有后续的RUN指令对/tmp目录的修改都不会被持久化到镜像的层中。Docker会为每个RUN指令创建的临时容器挂载一个全新的匿名卷到/tmp,而这个匿名卷在容器执行完指令被销毁后,也会被清理掉。

对应到你的Dockerfile步骤来看:

  • 第一步VOLUME /tmp:告诉Docker,这个目录是一个卷,后续对它的操作都走卷挂载逻辑。
  • 第二个RUN指令:下载oc.tar.gz到/tmp,但此时的/tmp是临时挂载的匿名卷,文件存在这个临时卷里。当这个RUN执行完,临时容器被删除,这个匿名卷也跟着被清理了。
  • 第三个RUN指令:Docker又创建了一个新的临时容器,同时挂载了一个全新的匿名卷到/tmp——这个新卷里自然没有之前下载的oc.tar.gz,所以ls看不到,解压也会报错。

解决方案

你有两个可选的解决方向:

  1. 移除VOLUME /tmp指令
    如果你的镜像不需要把/tmp作为可挂载的卷对外提供,直接删掉这条指令就行。这样/tmp就变成镜像里的普通目录,所有RUN指令对它的修改都会被保存到镜像层中,后续步骤就能正常访问之前的文件了。

  2. 合并相关操作到同一个RUN指令
    如果你必须保留VOLUME /tmp(比如基础镜像的设计要求,或者你的应用需要这个卷),那把下载、查看、解压的操作都放到同一个RUN里。这样所有操作都在同一个临时容器的同一个匿名卷里完成,不会因为容器销毁丢失文件:

    FROM fabric8/java-centos-openjdk8-jdk
    VOLUME /tmp
    RUN curl -k -Lo /tmp/oc.tar.gz "https://mirror.openshift.com/pub/openshift-v3/clients/3.6.173.0.21/linux/oc.tar.gz" \
        && ls -l /tmp \
        && tar zxf /tmp/oc.tar.gz -C /usr/local/bin \
        && rm /tmp/oc.tar.gz  # 可选:清理临时文件,减小镜像体积
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:03:39