【问题标题】:Docker build command creates large amount of folders in windowsfilter folder: what's the purpose and how to controlDocker build命令在windowsfilter文件夹中创建大量文件夹:目的是什么以及如何控制
【发布时间】:2021-11-05 04:06:14
【问题描述】:

我正在构建一个像 docker build . -t test 这样的新图像,并将主机操作系统文件夹中的内容复制到其中:

Dockerfile

FROM mcr.microsoft.com/windows/servercore:ltsc2019
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN mkdir root
RUN cd root
WORKDIR /root
RUN mkdir test
COPY test /root/test
    #USING 'COPY' here instead of 'ADD' because of https://stackoverflow.com/questions/24958140/what-is-the-difference-between-the-copy-and-add-commands-in-a-dockerfile

我在 Powershell 中得到这个输出:

PS D:\Programs> docker build . -t test
Sending build context to Docker daemon  1.644GB
Step 1/7 : FROM mcr.microsoft.com/windows/servercore:ltsc2019
ltsc2019: Pulling from windows/servercore
4612f6d0b889: Pull complete
c67ded6868b6: Pull complete
Digest: sha256:1be9c8378b8c32d31538253a4b96169f5138a5f6d4c0a04e8d8f9a80b9ac8097
Status: Downloaded newer image for mcr.microsoft.com/windows/servercore:ltsc2019
 ---> d1724c2d9a84
Step 2/7 : SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
 ---> Running in 1bfefefbe433
Removing intermediate container 1bfefefbe433
 ---> 37de702deb33
Step 3/7 : RUN mkdir root
 ---> Running in e26d6b49ced7


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         9/8/2021   1:07 PM                root


Removing intermediate container e26d6b49ced7
 ---> 451c4d3f3ea1
Step 4/7 : RUN cd root
 ---> Running in 74a228f8118f
Removing intermediate container 74a228f8118f
 ---> 3f175ac67f1d
Step 5/7 : WORKDIR /root
 ---> Running in 5f783d5b2332
Removing intermediate container 5f783d5b2332
 ---> 68b24e033f87
Step 6/7 : RUN mkdir test
 ---> Running in 5771bb7a593a


    Directory: C:\root


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----         9/8/2021   1:08 PM                test


Removing intermediate container 5771bb7a593a
 ---> 35fa0b2af157
Step 7/7 : COPY test /root/test
 ---> 60eab8242865
Successfully built 60eab8242865
Successfully tagged test:latest

它在主机操作系统的文件夹“\docker\windowsfilter”中创建八个(!)文件夹

这似乎太过分了,它看起来像是我的Dockerfile 中每个步骤的文件夹,那么所有这些文件夹有什么用,我可以阻止创建/自动删除不需要的文件夹以保持一切整洁吗?

主机操作系统:Windows Server 2019 标准版本 1809 17763.2114
Docker:版本 20.10.4,构建 110e091

请注意,我不使用 Docker 桌面应用程序,see here 我是如何安装 Docker 的。

更新 1

我根据@Noam 的建议更新了我的 Dockerfile,如下所示:

#RUN mkdir root
#RUN cd root
#WORKDIR /root
WORKDIR /root #creates root directory if not exists, then enters it

在此更改之后,windowsfilter 中创建了 6 个文件夹(而不是 8 个),因此我对 Docker 为 Dockerfile 中的每个命令创建一个文件夹的预感似乎是正确的。

【问题讨论】:

  • 你有什么windows版本?请指定确切的版本(即家庭版、专业版、服务器版、通用版、版本构建)

标签: windows docker containers windows-server-2019


【解决方案1】:

你好 @Flo 这个问题似乎是一个长期的问题,特别是 docker 桌面,

原因:

有时似乎可以解释它的一个选项是从旧版本的 docker desktop 升级,并且该软件不清理旧目录。

另一个我,docker 在那里保存构建的图像层,所以如果你有多个版本的相同图像,你的悬空的可能会驻留在那里,请求运行 docker image prune 甚至可能是 docker system prune

解决方案:

一个开源清理脚本已经发布,它似乎有很大帮助,它被称为docker-ci-zap,并且在大多数情况下它似乎处理得很好。

如果问题仍然存在,docker for desktop github issue page 中建议的修复方法是将 -removing 后缀添加到 windowsfilter 目录中的文件夹名称,然后重新启动以允许 docker 清理不需要的文件夹

如果它仍然引起问题,请尝试返回factory deafults,如果还是不行,也许新的docker for desktop install 可能会达成交易,尽管即便如此,有些人还是遇到了一些困难,所以最终如果它真的很麻烦并且你需要使用它,重新安装windows通常看起来像是最后一击。

Dockerfile 改进建议

在您的 Dockerfile 中,描述文件夹的行可能会由于非绝对路径和 Dockerfile 命令的不当使用而导致问题。

替换:

RUN mkdir root
RUN cd root
WORKDIR /root

与:

WORKDIR /root

它达到了相同的目的(创建并进入新的(如果还不存在的话)目录)

docker-ci-zap 是做什么的?

您可以通过查看 GitHub 存储库中用于编译 exe 文件的 the code 来大致了解:

它使用hcsshim 驱动程序及其DestroyLayer 函数从主机磁盘中删除图层文件,或者如文档所说:

DestroyLayer 将删除代表该层的磁盘文件 使用给定的路径,包括该层的包含文件夹,如果 任何。

【讨论】:

  • 谢谢。请查看我的更新 1. 不确定是否相关,但我不使用 Docker 桌面应用程序
  • @Flo 刚刚看到您是如何做到的,您可能会从使用 docker desktop 中受益,因为它有更多的社区和商业支持,并且可以在 windows server 2019 上运行。此外,您看到的有关文件夹的内容可能确认图像层假设
  • 再次感谢。我明确选择不使用 Docker Desktop,因为我运行的 VPS 不支持 Docker Desktop 所需的 Hyper-V。知道我今天不运行 Docker Desktop,您提到的错误是否仍然适用?有没有办法在我的 Dockerfile 中进一步整合命令? (ps 我检查了docker-ci-zap.exe,但我不清楚它到底做了什么)
  • @Flo 好的,我了解 Hyper-V 的问题。人们通常在windowsfilter 下的文件夹占用几十 GB 的存储空间(即 40GB 的价值)时运行它(docker-ci-zap),如果它保持相同的大小,那么这只是事情的问题,并且 docker 的实现为您正在使用它,这就是它保存构建图像的那些层的方式。如果你有使用 Linux 的经验,我建议你走这条路,但如果它太多了,而且你通常对现有的方式感到满意
  • 谢谢。那么我的最后一个问题是 docker-ci-zap 在幕后到底做了什么?我在 Github 上找不到描述。是prune 吗?全部删除?删除旧文件夹?大文件夹?还有什么?
猜你喜欢
  • 2020-07-06
  • 2011-08-03
  • 2015-01-21
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2022-06-13
  • 2011-04-18
  • 1970-01-01
相关资源
最近更新 更多