Dockerfile - 在一个RUN命令中删除文件,它仍然存在于下一个RUN命令中

时间:2016-03-12 19:51:29

标签: windows docker

我有一个Dockerfile(https://gist.github.com/hasMobi/e198555704ee57e84399)按顺序包含这两个命令:

Step 6 : RUN rm -fry /usr/share/nginx/html/* 
 ---> Running in b9a69992e4e0 
removed '/usr/share/nginx/html/index.html' 
removed '/usr/share/nginx/html/index.php' 
 ---> 2bfe01cbd007 
Removing intermediate container b9a69992e4e0 
Step 7 : RUN is /usr/share/nginx/html/ 
 ---> Running in 08396f6029e1 
index.html 
index.php 
 ---> a6471052519d 

当我在构建hte图像时查看控制台时,我可以清楚地看到从该文件夹中删除了2个文件,但是当下一个RUN命令到来时,它会列出目录的内容并且文件仍在那里?:

var Task = require('./modules/Task');
app.get('/get-all-tasks',function(req,res){
    res.setHeader('Content-Type', 'application/json');
    console.log(Task.getAllTasks()); // returns undefined
    res.json({msg:"Hej, this is a test"}); // returns object
});

这里发生了什么?我知道每个RUN命令创建一个单独的层,一个与另一个隔离,但不是第二个RUN命令,它应该以前一个RUN命令中的确切状态继承文件系统(2个文件消失了)?

2 个答案:

答案 0 :(得分:2)

基本上,基本映像中的ADD命令会覆盖Dockerfile中的RUN命令。有关详细信息,请参阅this

  

注意:如果内容已更改,则第一个遇到的ADD指令将使来自Dockerfile的所有后续指令的高速缓存无效。这包括使RUN指令的高速缓存无效。有关详细信息,请参阅Dockerfile最佳实践指南。

您可以考虑分支源基础图像并使用您的自定义版本。

答案 1 :(得分:1)

我遇到了类似的问题:

   RUN rm -rf /full/path
   RUN ln -s /other /full/path

这会失败,因为第二次运行时仍然存在“/ full / path”。此解决方法有效:

   RUN rm -rf /full/path; ln -s /other /full/path

我不理解这种行为,但在我的情况下能够解决这个问题。