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

Dzh*_*eyt 9 windows docker

我有一个Dockerfile(https://gist.github.com/hasMobi/e198555704ee57e84399)依次有这两个命令:

RUN rm -frv /usr/share/nginx/html/*
RUN ls /usr/share/nginx/html/
Run Code Online (Sandbox Code Playgroud)

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

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 
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ulC 8

我有一个类似的问题:

   RUN rm -rf /full/path
   RUN ln -s /other /full/path
Run Code Online (Sandbox Code Playgroud)

这将失败,因为“/full/path”在第二次 RUN 中仍然存在。此解决方法有效:

   RUN rm -rf /full/path; ln -s /other /full/path
Run Code Online (Sandbox Code Playgroud)

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

  • 您应该使用 && 而不是分号,因为 && 之后的命令仅在第一个命令没有失败时才执行。如果第一个命令是否失败并不重要,或者即使第一个命令失败第二个命令执行也很重要,那么使用分号进行命令链接就是您想要的。 (3认同)

ntw*_*uru 4

基本上,基础镜像中的 ADD 命令会覆盖 Dockerfile 中的 RUN 命令。请参阅了解更多信息。

注意:如果内容发生更改,第一个遇到的 ADD 指令将使 Dockerfile 中所有后续指令的缓存失效。这包括使 RUN 指令的缓存无效。有关更多信息,请参阅 Dockerfile 最佳实践指南。

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

  • 我尝试将“ls”命令、“rm”命令和后续的“ls”命令组合在同一个 RUN 指令中。链接命令的效果是:文件被列为现有、已删除,目录被列为空(如预期)。但是其自己的 RUN 指令中的后续“RUN ls /samedirectory”命令列出了我刚刚在上一个 RUN 指令中删除的相同文件。 (2认同)