我应该最å°åŒ–泊åžçª—层的数é‡å—?

时间:2017-11-02 15:34:35

标签: docker optimization dockerfile layer

documentation没有详细说明这个è¯é¢˜ã€‚它说:

  

最å°åŒ–图层数

     

在Docker 17.05之å‰ï¼Œç”šè‡³æ›´å¤šï¼Œä¹‹å‰   Docker 1.10,最大é™åº¦åœ°å‡å°‘你的层数   图片。以下改进å‡è½»äº†è¿™ç§éœ€æ±‚:

     

在Docker 1.10åŠæ›´é«˜ç‰ˆæœ¬ä¸­ï¼Œä»…创建RUN,COPYå’ŒADD指令   层。其他指令创建临时中间图åƒï¼Œå’Œ   ä¸å†ç›´æŽ¥å¢žåŠ æž„建的大å°ã€‚

     

Docker 17.05åŠæ›´é«˜ç‰ˆæœ¬å¢žåŠ äº†å¯¹å¤šé˜¶æ®µæž„å»ºçš„æ”¯æŒ Â Â å…许您仅将所需的工件å¤åˆ¶åˆ°æœ€ç»ˆå›¾åƒä¸­ã€‚   这å…许您在工具中包å«å·¥å…·å’Œè°ƒè¯•ä¿¡æ¯   中间构建阶段而ä¸å¢žåŠ æœ€ç»ˆçš„å¤§å° Â Â å›¾åƒã€‚

看起æ¥æœ€æ–°çš„Docker版本无法解决处ç†å¤šä¸ªå±‚的问题。他们å®æ„¿åŠªåŠ›å‡å°‘最终图åƒä¸­çš„æ•°é‡ã€‚最é‡è¦çš„是,文档并没有告诉为什么很多层都ä¸å¥½ã€‚

我知é“42层的AUFS limit。对于广泛使用的图åƒï¼Œä¿æŒè¾ƒå°çš„层数是有æ„义的,因为它有助于构建在其上的其他图åƒç¬¦åˆé™åˆ¶ã€‚但是,还有其他存储驱动程åºå’Œå›¾åƒç”¨äºŽå…¶ä»–目的。

将图åƒä¿æŒåœ¨ä¸€ä¸ªæ˜Žæ˜¾çš„原因也很好 - 它们会å ç”¨ç£ç›˜ç©ºé—´å’Œç½‘络带宽。但是,我ä¸è®¤ä¸ºchaining RUN statements并因此将多层压缩为一层有助于一般。如果ä¸åŒçš„RUN更新文件系统的ä¸åŒéƒ¨åˆ†ï¼Œåˆ™ä¸€å±‚和多层的大å°åº”该大致相åŒã€‚

å¦ä¸€æ–¹é¢ï¼Œè®¸å¤šå±‚å…许更快地使用缓存和é‡å»ºå›¾åƒã€‚它们也是并行的。

我在一个拥有ç§æœ‰Docker注册表的å°å›¢é˜Ÿä¸­å·¥ä½œã€‚我们永远ä¸ä¼šæ»¡è¶³42层é™åˆ¶ï¼Œä¸»è¦å…³æ³¨æ€§èƒ½å’Œå¼€å‘速度。

如果是这样,我应该最å°åŒ–泊åžçª—层的数é‡å—?

3 个答案:

答案 0 :(得分:20)

  

我在一个拥有ç§æœ‰Docker注册表的å°å›¢é˜Ÿä¸­å·¥ä½œã€‚我们永远ä¸ä¼šæ»¡è¶³42层é™åˆ¶ï¼Œä¸»è¦å…³æ³¨æ€§èƒ½å’Œå¼€å‘速度。

如果是这样,我应该最å°åŒ–泊åžçª—层的数é‡å—?

在你的情况下,没有。
需è¦æœ€å°åŒ–的是构建时间,这æ„味ç€ï¼š

  • ç¡®ä¿æœ€å¸¸ç”¨çš„步骤,最长的步骤,然åŽç¼“存,å…许你在快速é‡å»ºæ—¶é—´çš„åŒæ—¶æ‘†å¼„Dockerfile的最åŽå‡ è¡Œï¼ˆæœ€å…·ä½“的命令)。
  • ç¡®ä¿æœ€é•¿çš„RUN命令首先出现在自己的层中(å†æ¬¡è¢«ç¼“存),而ä¸æ˜¯ä¸Žå…¶ä»–RUN命令链接:如果其中一个失败,则必须é‡æ–°æ‰§è¡Œlong命令。如果该长命令在其自己的(Dockerfile行)/层中被隔离,则它将被缓存。

è¯è™½å¦‚此,the documentation you mentionæ¥è‡ªdocker/docker.github.io,正好是PR 4992å’ŒPR 4854,æ¥è‡ªdocker build LABEL section。 所以这一部分是在关于LABEL的类似评论之åŽå‘生的,åªæ˜¯å¼ºè°ƒäº†åˆ›å»ºå›¾å±‚的命令 åŒæ ·ï¼Œåœ¨æ‚¨çš„情况下,这ä¸é‡è¦ã€‚

答案 1 :(得分:16)

我åªæƒ³çœ‹çœ‹2个图åƒçš„区别是什么,一个是用多个RUN构建的,å¦ä¸€ä¸ªæ˜¯ç”¨ä¸€ä¸ªRUN连接命令构建的。

在第一ç§æƒ…况下,图åƒæ­£åœ¨è¿›è¡Œç®€å•çš„æ“作(创建和删除文件)。

"å•èº«ï¼†ï¼ƒ34;的内容图层图片:

FROM busybox

RUN echo This is the 1 > 1 \
    && rm -f 1 \
    && echo This is the 2 > 2 \
    && rm -f 2 \
# ... for about 70 commands

多层图片的内容:

FROM busybox

RUN echo This is the 1 > 1
RUN rm -f 1
RUN echo This is the 2 > 2
RUN rm -f 2
# ... for about 70 layers

构建时间éžå¸¸ä¸åŒï¼ˆå€æ•°ï¼š0m34,973s,å•æ•°ï¼š0m0,568s)。容器å¯åŠ¨æ—¶é—´ä¹Ÿä¸åŒä½†ä¸å¤ªæ˜Žæ˜¾ï¼ˆå¤šä¸ªï¼š0m0,435s,å•æ•°ï¼š0m0,378s)。我在图åƒä¸Šè¿è¡Œçš„时间ä¸åŒï¼Œä½†æ—¶é—´å¹¶æ²¡æœ‰é‚£ä¹ˆå¤§çš„改å˜ã€‚

关于空间,我已ç»è€ƒè™‘了多层情况下最å情况的目的,正如预期的那样,多层图åƒæ¯”å•å±‚更大。

在å¦ä¸€ä¸ªæµ‹è¯•ä¸­ï¼Œæˆ‘连接了仅å‘图åƒæ·»åŠ å†…容的图层。构建时间与å‰ä¸€ç§æƒ…况相比没有å˜åŒ–,但è¿è¡Œæ—¶æƒ…况显示略有ä¸åŒï¼šå¤šå±‚图åƒçš„å¯åŠ¨é€Ÿåº¦æ¯”å•å±‚图åƒå¿«ã€‚关于空间,相åŒçš„结果。

我ä¸è®¤ä¸ºè¿™è¯æ˜Žäº†ä»€ä¹ˆï¼Œä½†æˆ‘很ä¹æ„这样åšï¼šP

答案 2 :(得分:7)

å‡å°‘层数本身就ä¸æ˜¯ä¸€ä¸ªç›®æ ‡ã€‚相å,您需è¦å…³æ³¨çš„是缩短构建时间并å‡å°‘图åƒå°ºå¯¸ã€‚

通过ä¿ç•™Dockerfile顶部或基本映åƒä¸­å¾ˆå°‘更改的公共图层,å¯ä»¥å‡å°‘构建时间。这å…许在以åŽçš„构建中缓存和é‡ç”¨è¯¥å±‚。这ä¸æ˜¯å…³äºŽå‡å°‘层数,而是关于更好地排åºå›¾å±‚。

缩å°æ˜ åƒå¤§å°æœ‰åŠ©äºŽå‡å°‘注册表æœåŠ¡å™¨ä¸Šçš„ç£ç›˜ä½¿ç”¨é‡ï¼Œè¿™ä¼šåœ¨ä¸ºCI系统上的æ¯ä¸ªæž„建存储映åƒæ—¶çœ‹åˆ°ç£ç›˜å¤§é‡å‘½ä¸­ã€‚它还å‡å°‘了传输图åƒçš„网络时间。如果您有一个下载大型临时文件的图层并将其删除到å¦ä¸€ä¸ªå›¾å±‚中,则会导致该文件ä¿ç•™åœ¨ç¬¬ä¸€å±‚,通过网络å‘é€å¹¶å­˜å‚¨åœ¨ç£ç›˜ä¸Šï¼Œå³ä½¿å®ƒåœ¨å†…部ä¸å¯è§ä½ çš„容器。更改文件的æƒé™è¿˜ä¼šå¯¼è‡´æ–‡ä»¶è¢«å¤åˆ¶åˆ°å…·æœ‰æ–°æƒé™çš„当å‰å±‚,从而使该文件的ç£ç›˜ç©ºé—´å’Œç½‘络带宽加å€ã€‚

在上述场景中å‡å°‘图åƒå¤§å°çš„标准解决方案是链接RUN命令,以便临时文件永远ä¸ä¼šå­˜å‚¨åˆ°å›¾åƒå±‚。这具有å‡å°‘图åƒå±‚数的副作用。

还有最åŽä¸€ä¸ªé—®é¢˜ï¼Œå³è¿‡åº¦ç¼“存。这在Debian图åƒä¸­çš„apt-get updateå’Œapt-get install ...命令中很常è§ã€‚如果ä¸å°†è¿™äº›å‘½ä»¤é“¾æŽ¥åœ¨ä¸€èµ·ï¼Œåˆ™apt-get install命令的更新将é‡ç”¨å‰ä¸€å±‚apt-get update命令中å¯èƒ½è¿‡æ—¶çš„缓存,并且在几个月åŽæ— æ³•æ‰¾åˆ°æ‰€éœ€çš„包时将失败。因此,您应该链接这些命令,å³ä½¿å®ƒä¼šå¢žåŠ æž„建时间,因为å¦ä¸€ä¸ªé€‰é¡¹æ˜¯å°†æ¥ä¼šå‡ºçŽ°æž„建失败。

因此,å‡å°‘你想è¦çš„层的副作用更多,ä¸ä¸€å®šæ˜¯ä¸ºäº†å‡å°‘层数而å‡å°‘层数。