Optimiser un docker build via Travis-CI

Voici une astuce pour optimiser le temps de build d'une image Docker via Travis-CI (merci Seboss666 de me forcer à la partager) 🤪

J'utilise Travis-CI pour quelques projets mais surtout pour builder, tester et pousser de manière automatique mon image docker ruTorrent (les sources sont ici). J'utilisais à l'époque la méthode AUTOMATED BUILD qui est disponible sur le Docker Hub mais c'était beaucoup moins bien pour les tests. D'autant plus qu'il y a une vue publique des résultats des tests/builds (exemple) et c'est plutôt bien intégré dans Github.

Le build de l'image dure en moyenne 20 minutes, ouai c'est long mais ça a l'avantage d'avoir une image prête à l'emploi sans problème de dépendances. Bon après 20 minutes à refaire un build complet alors qu'on a seulement modifié un fichier appartenant qu'aux derniers layers, c'est relativement chiant (j'suis pas très patient). Cette astuce est donc là pour optimiser le temps de build en ré-utilisant les layers, du coup on passe de 20 à 2 minutes, bien non ?

L'astuce consiste donc à puller l'image de base (ici latest) pour avoir une base des layers avant de lancer le build. Bon techniquement ça n'avait pas fonctionné du premier coup et j'ai du spécifier la source (toujours latest) au moment du build.

docker pull djerfy/rutorrent:latest
docker build --cache-from djerfy/rutorrent:latest -t djerfy/rutorrent:${TRAVIS_COMMIT} .

Voilà c'est tout (mon .travis.yml est ici) ! Ceci dit s'il y a une modification des premiers layers, ça invalidera le reste et le build sera complet mais si votre image est plutôt bien faite, c'est un rare cas. Petite astuce mais qui vous fera gagner pas mal de temps 😎

Bye!