0

在 docker 1.10 之后,docker history如果您从其他地方拉取图像,则不再显示图像的中间层,而不是在本地构建。

这个 github issue讨论了这个变化,并且还提到使用docker saveand docker load,你可以利用中间层作为缓存。

这是否意味着,如果构建了一个图像并简单地将其上传到存储库(即没有 tar 文件),那么下载该图像的人就无法恢复中间层?

我特别想知道的是:

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

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


我知道还有其他处理凭据或敏感文件的方法,例如设置本地服务器和RUN wget file && use file && rm fileswarm 的 docker secret,或使用 docker vault。我不是在寻找不同的方法来处理敏感文件;相反,我只是对上述方法是否使文件可访问感兴趣。谢谢!

4

2 回答 2

1

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

这些层存储在硬盘驱动器上,并且可能很容易访问,具体取决于所使用的存储驱动程序。至少对于 overlay2,这在docker image inspect.GraphDriver 部分下的输出中是可见的。

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

于 2017-10-12T00:35:42.427 回答
0

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

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

于 2017-10-11T23:23:14.620 回答