我有一个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个文件消失了)?
答案 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
我不理解这种行为,但在我的情况下能够解决这个问题。