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