在docker 1.10之后有没有办法从中间层访问文件?

在docker 1.10之后,如果您从其他位置将其拖出, docker history将不再显示图像的中间层,而不是在本地构build。

这个github问题讨论了这个变化,还提到使用docker savedocker load ,你可以使用中间层作为caching。

这是否意味着,如果一个图像是build立,只是上传到一个存储库(即没有tar文件),有没有办法下载图像的人来恢复中间层?

我特别想知道的是:

 COPY sensitive_file . RUN do_something_with ./sensitive_file RUN rm ./sensitive_file 

是否可以像上面那样编写Dockerfile,并假设(除非docker中有一个未知的漏洞),这个敏感文件将不会被其他人访问?


我知道,还有其他方式来处理凭据或敏感文件,如设置本地服务器和RUN wget file && use file && rm file ,群集docker机密,或使用docker保险库。 我不是在寻找处理敏感文件的不同方法, 而我只是有兴趣,如果上述方法使文件可访问或不。 谢谢!

即使您没有每个图层的图像ID,该图像仍然作为图层发货。 您可以在docker docker image inspect $image_name看到.RootFS.Layers部分下的docker image inspect $image_name

这些图层存储在硬盘驱动器上,根据所使用的存储驱动程序,可以轻松访问这些图层。 至less在overlay2中,这是在.GraphDriver部分下的docker docker image inspect输出中可见的。

最后,您可以使用docker save在从registry中获取映像副本的任何docker引擎上,将其转换回包含每个图层作为tar文件的tar文件。 因此,通过registry传输图像并不能消除这种攻击媒介。

Docker映像由1个或多个文件系统层组成。 修改文件系统的Dockerfile中的每条命令都会创build一个新的文件系统层。 从较高层删除后,敏感文件将保留在其图层中(后续的Dockerfile步骤)。

您需要导出/导入构build的图像以平铺图像图层,并从使用build议的步骤构build的图像中删除敏感文件。