Docker创build太多的图像

我有几个项目在他们自己的docker项目中。 我已经注意到,随着时间的推移,当我需要build立一个新的环境,需要更长,更长的时间才能完成。 看起来每个版本都是从25到100mb的任何地方,并且每次都下载它们。

有什么可能导致这一点,有没有更好的办法呢?

Pulling repository private.repo.com:8080/project 24e73aa61b9e: Pulling dependent layers e9e06b06e14c: Download complete a82efea989f9: Download complete 37bea4ee0c81: Download complete 07f8e8c5e660: Download complete eebb8b8af862: Download complete 66dfa7610c51: Download complete be9344bb178f: Download complete f9b0b5922fcc: Download complete d538871b66d9: Download complete 63b83602dd59: Download complete 4701d9c2b782: Download complete e0867454dc78: Download complete 5f8f0c295506: Download complete ff20a42d5239: Download complete 79093a41f7a4: Download complete f67f10a60f8f: Download complete 9ae271a15a20: Download complete b8e39263e460: Download complete cd92a7abfb56: Download complete 3ab53402c585: Download complete e6fbd8fbe1c8: Download complete 6b741d246738: Download complete 5d2de83d20bf: Download complete 72c062ac5a98: Download complete 8b9f7ca662b7: Download complete 10e830b030bf: Download complete 2f9c03ddb7f7: Download complete 3a7a81509db4: Download complete 11f4dab16ebd: Downloading [=======> ] 15.68 MB/106 MB 

你的Dockerfiles中有太多的命令。 每个命令( RUNENVEXPOSE等)都会在生成的图像中创build一个新图层,并且必须下载每个图层才能下载完整图像。 尝试通过将多个RUN命令与&&组合成一个RUN来减less层数。

没有声誉来添加评论,因此添加一个答案。 除了@ jwodder的回答之外,还应该记住,在编写用于生成映像的Dockerfiles时,命令的顺序也起着重要的作用。

假设在dockerfile中有15个命令用于生成一个项目的泊坞窗图像。

要生成另一个项目的图像,只需在第三个和第四个命令之间添加一个不同的命令 – >这将导致文件系统中共有28个图层(第一个项目为15个图层+(16-3 [cache / reused the first来自第一个项目的三层])。

这是因为,Docker总是为每个命令创build一个层,并检查caching是否存在与当前命令+上一个caching层哈希匹配的immage。 如果它们中的任何一个不匹配,则将最终创build新的图像。 因此,如果在它们之间引入了一条命令,那么所有后续的图像层都将失效,Docker会为后续的构build创build新的图层。

这也适用于同一个项目,更改版本属性可能在前几个命令中。 这将导致以前创build的所有caching层无效,现在同样的项目会创build更多的图层。