在docker 1.10之后,docker history
如果从其他地方拉出图像,则不再显示图像的中间层,而不是在本地构建。
This github issue讨论了这一变化,并提到使用docker save
和docker load
,您可以将中间层用作缓存。
这是否意味着,如果图像是构建的并且只是上传到存储库(即没有tar文件),那么下载图像的人无法恢复中间层?
我特别想知道的是:
COPY sensitive_file .
RUN do_something_with ./sensitive_file
RUN rm ./sensitive_file
是否可以像上面那样编写Dockerfile,并假设(除非docker中存在未知漏洞),其他人无法访问此敏感文件?
我知道还有其他方法可以处理凭据或敏感文件,例如设置本地服务器和RUN wget file && use file && rm file
,使用swarm设置docker secret或使用docker vault。我不是在寻找处理敏感文件的不同方法;相反,我只是感兴趣,如果上述方法使文件可访问或不。谢谢!
答案 0 :(得分:1)
即使您没有每个图层的图片ID,图片仍然以图层形式发货。您可以在。docker image inspect $image_name
下的.RootFS.Layers部分中看到。
这些图层存储在硬盘驱动器上,并且可以根据所使用的存储驱动程序轻松访问。至少使用overlay2,这在.GraphDriver部分下的docker image inspect
输出中可见。
最后,您可以在任何已从注册表中提取图像副本的docker引擎上使用docker save
,将其转换回包含每个图层作为tar文件的tar文件。因此,通过注册表传输图像不会消除此攻击媒介。
答案 1 :(得分:0)
Docker Images由一个或多个文件系统层组成。 Dockerfile
中修改文件系统的每个命令都将创建一个新的文件系统层。从较高层删除后,敏感文件将保留在其图层中(后续Dockerfile
步骤)。
您需要导出/导入构建的图像以展平图像图层,并从使用建议步骤构建的图像中删除敏感文件。