Docker : optimisation de la taille des images

Pour illustrer la démarche ci-dessous,j’ai pris pour exemple une images pour un server LAMP.

La version non optimisé du Dockerfile :

FROM fedora:21
MAINTAINER "Christophe Brun" <christophe.brun.cl194@gadz.org>

RUN yum -y update 
RUN yum -y install httpd supervisor php php-imap php-mcrypt php-gd php-pear-Net-Curl php-mysqlnd php-pear 
RUN yum clean all

ADD start.sh /start.sh
RUN chmod -v +x /start.sh 
RUN echo "Apache" >> /var/www/html/index.html

EXPOSE 80
ADD supervisord.conf /etc/supervisord.conf

CMD ["/start.sh"]

On obtient une image de 750 Mo environ. Pour avoir le détail, on appel la commande history de docker ce qui donne :

[cbrun@cbrun ]$ docker history chbrun/httpd
IMAGE          CREATED             CREATED BY                        SIZE
8f1fbd8c84a8   7 days ago   /bin/sh -c #(nop) CMD [/start.sh]         0 B
e44fb1418d5d   7 days ago   /bin/sh -c chmod -v +x /start.sh         62 B
8dd1e15e8253   7 days ago   /bin/sh -c #(nop) ADD file:c5f9cfa...    62 B
96f6180b14c9   7 days ago   /bin/sh -c #(nop) ADD file:90677b7...    87 B
5f27af7596ec   7 days ago   /bin/sh -c #(nop) EXPOSE map[80/tc...     0 B
701479e0f2fb   7 days ago   /bin/sh -c echo "Apache" >> /var/w...     7 B
f1669d567907   7 days ago   /bin/sh -c yum clean all                1.7 MB
412b154452e6   7 days ago   /bin/sh -c yum -y install php php-...  60.0 MB
0aca6c485149   7 days ago   /bin/sh -c yum -y install httpd ...    24.7 MB
4622e0cdcf27   7 days ago   /bin/sh -c yum -y update              402.3 MB
d66072620a80   7 days ago   /bin/sh -c #(nop) MAINTAINER "Chri...     0 B
834629358fe2   3 weeks ago  /bin/sh -c #(nop) ADD file:1314084... 250.2 MB
00a0c78eeb6d  10 weeks ago  /bin/sh -c #(nop) MAINTAINER Lokes...     0 B
511136ea3c5a  19 months ago                                           0 B

Pour avoir une version optimisée, il suffit de mettre les commandes RUN sur une ligne pour limiter le nombre de layer. En effet, à chaque RUN docker va générer un nouveau layers pour stocker le delta avec le précédent. Du coup, plus on a de lignes avec un RUN, plus on va avoir de couches et donc plus la taille de l’image sera importante. Cela donne cette version de Dockerfile

FROM fedora:21
MAINTAINER "Christophe Brun" <christophe.brun.cl194@gadz.org>

RUN yum -y update && yum -y install httpd supervisor php php-imap php-mcrypt php-gd php-pear-Net-Curl php-mysqlnd php-pear && yum clean all

ADD start.sh /start.sh
RUN chmod -v +x /start.sh && echo "Apache" >> /var/www/html/index.html

EXPOSE 80
ADD supervisord.conf /etc/supervisord.conf

CMD ["/start.sh"]

On obtient un gain de 140 Mo environ, l’history de l’image donne :

[cbrun@cbrun ]$ docker history cbrun/httpd
IMAGE          CREATED             CREATED BY                        SIZE
8e2bf637b1fa   16 hours ago /bin/sh -c #(nop) CMD [/start.sh]         0 B
6879b173dbf6   16 hours ago /bin/sh -c #(nop) ADD file:3caba19...    87 B
cc8c459f4e45   16 hours ago /bin/sh -c #(nop) EXPOSE map[80/tc...     0 B
dc307c2c13d9   16 hours ago /bin/sh -c chmod -v +x /start.sh &...    69 B
39f2be03e8e3   16 hours ago /bin/sh -c #(nop) ADD file:b7948bb...    62 B
6cf364c887be   16 hours ago /bin/sh -c yum -y update && yum -y... 304.4 MB
088ae09b7a55    3 weeks ago /bin/sh -c #(nop) MAINTAINER "Chri...     0 B
bfe0bb6667e4    6 weeks ago /bin/sh -c #(nop) ADD file:017c27e... 250.2 MB
00a0c78eeb6d   10 weeks ago /bin/sh -c #(nop) MAINTAINER Lokes...     0 B
511136ea3c5a   19 months ago                                          0 B

C’est déjà sympa, reste à essayer les autres astuces de l’article

comments powered by Disqus