@@ -11,10 +11,6 @@ dépendances. L'intégration continue est un moyen d'y arriver mais je
...
@@ -11,10 +11,6 @@ dépendances. L'intégration continue est un moyen d'y arriver mais je
dirais que notre objectif n'est pas d'en faire des experts de
dirais que notre objectif n'est pas d'en faire des experts de
développement logiciel et de l'intégration continue.
développement logiciel et de l'intégration continue.
Il est possible de s'arrêter à l'étape 3. Ceux qui veulent allez plus
loin vont jusqu'à l'étape 6. Et ceux qui veulent vraiment contrôler
finement, passent par l'étape 7 et aller au delà.
Ayant peu d'expérience avec Docker, je me suis appuyé sur la
Ayant peu d'expérience avec Docker, je me suis appuyé sur la
[[https://people.irisa.fr/Anthony.Baire/docker-tutorial.pdf][présentation d'Anthony Baire]] pour préparer cette séquence.
[[https://people.irisa.fr/Anthony.Baire/docker-tutorial.pdf][présentation d'Anthony Baire]] pour préparer cette séquence.
...
@@ -37,83 +33,75 @@ Ayant peu d'expérience avec Docker, je me suis appuyé sur la
...
@@ -37,83 +33,75 @@ Ayant peu d'expérience avec Docker, je me suis appuyé sur la
- Mettre en place un test pour s'assurer de sa robustesse (*Continuous
- Mettre en place un test pour s'assurer de sa robustesse (*Continuous
Integration*) en déportant son exécution dans des environnements
Integration*) en déportant son exécution dans des environnements
controllés
controllés
* Table des matières :TOC:
* Table des matières et Progression :TOC:
- [[#objectifs-et-problématique][Objectifs et Problématique]]
- [[#objectifs-et-problématique][Objectifs et Problématique]]
- [[#problématiques][Problématiques:]]
- [[#problématiques][Problématiques:]]
- [[#objectifs][Objectifs]]
- [[#objectifs][Objectifs]]
- [[#progression][Progression]]
- [[#séquence-1-familiarisation-avec-le-principe-de-conteneur][Séquence 1: Familiarisation avec le principe de conteneur]]
- [[#automatiser-lexécution-dun-notebook][Automatiser l'exécution d'un notebook]]
- [[#11-premiers-pas-avec-docker][1.1 Premiers pas avec Docker]]
- [[#identifier-les-dépendances][Identifier les dépendances]]
- [[#12a-utiliser-docker-pour-travailler-au-jour-le-jour-jupyter][1.2(A) Utiliser docker pour travailler au jour le jour: Jupyter]]
- [[#sassurer-que-docker-est-bien-installé][S'assurer que docker est bien installé]]
- [[#12b-utiliser-docker-pour-travailler-au-jour-le-jour-rstudio][1.2(B) Utiliser docker pour travailler au jour le jour: Rstudio]]
- [[#récupérer-une-image-de-base][Récupérer une image de base]]
- [[#12c-utiliser-docker-pour-travailler-au-jour-le-jour-emacs][1.2(C) Utiliser docker pour travailler au jour le jour: Emacs]]
- [[#exécuter-une-commande-dans-un-conteneur][Exécuter une commande dans un conteneur]]
- [[#13-limitations][1.3 Limitations]]
- [[#docker-en-interactif][Docker en interactif]]
- [[#séquence-2-créer-son-propre-environnement-automatiser-sa-construction-et-le-partage][Séquence 2: Créer son propre environnement, automatiser sa construction et le partage]]
- [[#installer-tous-les-paquets-dont-on-a-besoin][Installer tous les paquets dont on a besoin]]
- [[#21-récupérer-une-image-de-base][2.1 Récupérer une image de base]]
- [[#gérer-ses-conteneurs-et-figer-un-environnement][Gérer ses conteneurs et figer un environnement]]
- [[#22-installer-tous-les-paquets-dont-on-a-besoin][2.2 Installer tous les paquets dont on a besoin]]
- [[#exécuter-notre-notebook-dans-ce-nouvel-environnemnt][Exécuter notre notebook dans ce nouvel environnemnt]]
- [[#23-gérer-ses-conteneurs-et-figer-un-environnement][2.3 Gérer ses conteneurs et figer un environnement]]
- [[#conclusion][Conclusion]]
- [[#24-automatiser-la-construction-de-son-environnement][2.4 Automatiser la construction de son environnement]]
- [[#automatiser-la-construction-dun-environnement-et-le-partager][Automatiser la construction d'un environnement et le partager.]]
- [[#25-mettre-son-image-à-disposition][2.5 Mettre son image à disposition]]
- [[#automatiser-la-construction-de-son-environnement][Automatiser la construction de son environnement]]
- [[#26-limitations][2.6 Limitations]]
- [[#mettre-son-image-à-disposition][Mettre son image à disposition]]
- [[#27-exemple-de-reconstruction-dun-vieil-environnement-optionnel][2.7 Exemple de reconstruction d'un "vieil" environnement (Optionnel)]]
- [[#tester-que-votre-code-sexécute-correctement-ailleurs-que-sur-votre-machine][Tester que votre code s'exécute correctement ailleurs que sur votre machine.]]
- [[#séquence-3-mettre-en-place-un-test-et-utiliser-lintégration-continue-pour-sassurer-de-la-robustesse-dun-code][Séquence 3: Mettre en place un test et utiliser l'intégration continue pour s'assurer de la robustesse d'un code]]
- [[#création-dun-projet-test-et-mise-en-place-de-lintégration-continue][Création d'un projet test et mise en place de l'intégration continue]]
- [[#31-exécuter-ce-notebook-dans-un-conteneur-et-mettre-en-place-un-test][3.1 Exécuter ce notebook dans un conteneur et mettre en place un test]]
- [[#et-maintenant-jupyter-avec-notre-image-docker][Et maintenant, Jupyter avec notre image docker!]]
- [[#32-activer-lintégration-continue-pour-que-ce-test-soit-exécuté-à-chaque-commit-dans-le-conteneur-de-notre-choix][3.2 Activer l'intégration continue pour que ce test soit exécuté à chaque commit dans le conteneur de notre choix]]
- [[#améliorer-le-test][Améliorer le test]]
- [[#33-rajouter-un-test-pour-repérer-si-des-environnements-plus-à-jour-cassent-notre-test][3.3 Rajouter un test pour repérer si des environnements plus à jour cassent notre test]]
- [[#aller-plus-loin][Aller plus loin]]
- [[#34-limitations][3.4 Limitations]]
- [[#time-machine][Time machine]]
- [[#debian-stretch-with-packages-from-march-2018][Debian Stretch with packages from march 2018]]
* Séquence 1: Familiarisation avec le principe de conteneur
- [[#ressources][Ressources]]
** 1.1 Premiers pas avec Docker
- [[#jupyter][Jupyter]]
- S'assurer que docker est bien installé
- [[#rstudio][Rstudio]]
- Récupérer une image de base
- [[#emacs][Emacs]]
- Exécuter une commande dans un conteneur
- [[#docker-for-windows][Docker for windows]]
- Utiliser docker en interactif (réaliser qu'il n'y a pas d'effet
de bord)
* Progression
- Partager un répertoire avec un conteneur
1. Familiarisation avec le principe de conteneur.
** 1.2(A) Utiliser docker pour travailler au jour le jour: Jupyter
- Premiers pas avec Docker
- (Exécuter un notebook dans un environnement sans interaction)
- S'assurer que docker est bien installé
** 1.2(B) Utiliser docker pour travailler au jour le jour: Rstudio
- Récupérer une image de base
** 1.2(C) Utiliser docker pour travailler au jour le jour: Emacs
- Exécuter une commande dans un conteneur
** 1.3 Limitations
- Utiliser docker en interactif (réaliser qu'il n'y a pas d'effet
- Instabilité de cet environnement (latest vs. un plus vieux)
de bord)
- Que contient-il vraiment ?
- Partager un répertoire avec un conteneur
- Besoin de choses en plus ? en moins ?
- Utiliser docker pour travailler au jour le jour
- Perméabilité si vous installez des choses dans cet
- Lancement de Jupyter/Rstudio/Emacs
environnement (à moins de le figer)
- (Exécuter un notebook dans un environnement sans interaction)
- Bonne pratique: repérer le tag et bien le préciser
- Limitations:
* Séquence 2: Créer son propre environnement, automatiser sa construction et le partage
- Instabilité de cet environnement (latest vs. un plus vieux)
** 2.1 Récupérer une image de base
- Que contient-il vraiment ?
** 2.2 Installer tous les paquets dont on a besoin
- Besoin de choses en plus ? en moins ?
** 2.3 Gérer ses conteneurs et figer un environnement
- Perméabilité si vous installez des choses dans cet
** 2.4 Automatiser la construction de son environnement
environnement (à moins de le figer)
** 2.5 Mettre son image à disposition
- Bonne pratique: repérer le tag et bien le préciser
** 2.6 Limitations
2. Créer son propre environnement, automatiser sa construction et le partage
- On peut figer son environnement mais on n'a pas expliqué
- Récupérer une image de base
comment le faire. Le dockerfile est un bon point de départ mais
- Installer tous les paquets dont on a besoin
s'il s'appuie sur des cibles "mouvantes", ça sera insuffisant
- Gérer ses conteneurs et figer un environnement
dans quelques temps.
- Automatiser la construction de son environnement
- Bonne pratique: Indiquer la recette (le Dockerfile), les
- Mettre son image à disposition
versions exactes des logiciels utilisés pour permettre à
- Limitations:
quelqu'un d'autre de facilement en faire une variation
- On peut figer son environnement mais on n'a pas expliqué
** 2.7 Exemple de reconstruction d'un "vieil" environnement (Optionnel)
comment le faire. Le dockerfile est un bon point de départ mais
(tel qu'on aurait pu le faire il y a un an et demi/deux ans)
s'il s'appuie sur des cibles "mouvantes", ça sera insuffisant
* Séquence 3: Mettre en place un test et utiliser l'intégration continue pour s'assurer de la robustesse d'un code
dans quelques temps.
Point de départ: un notebook
- Bonne pratique: Indiquer la recette (le Dockerfile), les
** 3.1 Exécuter ce notebook dans un conteneur et mettre en place un test
versions exactes des logiciels utilisés pour permettre à
- Utiliser nbconvert et diff
quelqu'un d'autre de facilement en faire une variation
** 3.2 Activer l'intégration continue pour que ce test soit exécuté à chaque commit dans le conteneur de notre choix
- [Optionnel] Exemple de reconstruction d'un environnement tel
** 3.3 Rajouter un test pour repérer si des environnements plus à jour cassent notre test
qu'on aurait pu le faire il y a un an et demi/deux ans.
** 3.4 Limitations
3. Mettre en place un test et utiliser l'intégration continue pour
- Qui a "raison" ? Comment savoir ce qui a causé la différence ?
s'assurer de la robustesse d'un code.
* Old notes :noexport:
** Autre progression :noexport:
Point de départ: un notebook
- Exécuter ce notebook dans un conteneur et mettre en place un test
(nbconvert, diff)
- Activer l'intégration continue pour que ce test soit exécuté à
chaque commit dans le conteneur de notre choix
- Rajouter un test pour repérer si des environnements plus à jour
cassent notre test
* Autre progression :noexport:
1. Automatiser l'exécution d'un notebook sur sa machine -> script. Pas
1. Automatiser l'exécution d'un notebook sur sa machine -> script. Pas
de contrôle du tout de l'environnement. *Où stoquer le résultat?*
de contrôle du tout de l'environnement. *Où stoquer le résultat?*
*Comment indiquer si c'est OK ?*
*Comment indiquer si c'est OK ?*
...
@@ -127,7 +115,7 @@ Ayant peu d'expérience avec Docker, je me suis appuyé sur la
...
@@ -127,7 +115,7 @@ Ayant peu d'expérience avec Docker, je me suis appuyé sur la
recette ?
recette ?
6. Reconstruire un environnement particulier? Une vieille debian par
6. Reconstruire un environnement particulier? Une vieille debian par
exemple ?
exemple ?
* Automatiser l'exécution d'un notebook
** Automatiser l'exécution d'un notebook
Commençons par un notebook tout simple, celui de challenger, et
Commençons par un notebook tout simple, celui de challenger, et
vérifions qu'il s'exécute bien sur "ma machine". Je commence par créer
vérifions qu'il s'exécute bien sur "ma machine". Je commence par créer
un répertoire pour ce notebook.
un répertoire pour ce notebook.
...
@@ -291,7 +279,7 @@ et les valeurs de Log-Likelihood et de Deviance sont très
...
@@ -291,7 +279,7 @@ et les valeurs de Log-Likelihood et de Deviance sont très
différentes. Que s'est-il passé ? A priori, ce sont des bibliothèques
différentes. Que s'est-il passé ? A priori, ce sont des bibliothèques
python différentes qui ont été utilisées et qui expliquent ces
python différentes qui ont été utilisées et qui expliquent ces
différences. Nous allons voir comment contrôler tout ceci.
différences. Nous allons voir comment contrôler tout ceci.
* Identifier les dépendances
** Identifier les dépendances
Je vais vous montrer comment créer et manipuler une image et un
Je vais vous montrer comment créer et manipuler une image et un
conteneur docker sur ma machine pas à pas. Vous n'aurez pas forcément
conteneur docker sur ma machine pas à pas. Vous n'aurez pas forcément
à réaliser ce genre de choses par la suite sur votre machine mais il
à réaliser ce genre de choses par la suite sur votre machine mais il
...
@@ -314,7 +302,7 @@ différentes ou identiques.
...
@@ -314,7 +302,7 @@ différentes ou identiques.
conteneurs différents pour vérifier si votre programme fonctionne
conteneurs différents pour vérifier si votre programme fonctionne
toujours bien.
toujours bien.
** S'assurer que docker est bien installé
*** S'assurer que docker est bien installé
Je suis sur une machine linux (une debian) et j'ai donc installé
Je suis sur une machine linux (une debian) et j'ai donc installé
docker via le paquet =docker.io=. J'ai aussi pris soin de me mettre dans
docker via le paquet =docker.io=. J'ai aussi pris soin de me mettre dans
le groupe docker pour ne pas avoir à passer root à chaque fois. Voici
le groupe docker pour ne pas avoir à passer root à chaque fois. Voici
...
@@ -347,7 +335,7 @@ Server:
...
@@ -347,7 +335,7 @@ Server:
OS/Arch: linux/amd64
OS/Arch: linux/amd64
Experimental: false
Experimental: false
#+end_example
#+end_example
** Récupérer une image de base
*** Récupérer une image de base
Nous pouvons commener. L'idée pour bien contrôler son environnement va
Nous pouvons commener. L'idée pour bien contrôler son environnement va
être de partir d'un environnement minimaliste et dans lequel notre
être de partir d'un environnement minimaliste et dans lequel notre
notebook aura d'ailleurs peu de chances de s'exécuter. Je partirai
notebook aura d'ailleurs peu de chances de s'exécuter. Je partirai
...
@@ -386,7 +374,7 @@ debian stable 40e13c3c9aab 12 day
...
@@ -386,7 +374,7 @@ debian stable 40e13c3c9aab 12 day
Mon image apparaît. Elle fait 114MB et a été construite il y a 12
Mon image apparaît. Elle fait 114MB et a été construite il y a 12
jours.
jours.
** Exécuter une commande dans un conteneur
*** Exécuter une commande dans un conteneur
Grâce à la commande docker run, je vais pouvoir exécuter des commandes
Grâce à la commande docker run, je vais pouvoir exécuter des commandes
dans le conteneur que je viens de télécharger. Par exemple, comme ceci.
dans le conteneur que je viens de télécharger. Par exemple, comme ceci.
#+begin_src shell :session *shell* :results output :exports both
#+begin_src shell :session *shell* :results output :exports both
...
@@ -450,7 +438,7 @@ peu comme si un mini-système d'exploitation démarrait, exécutait cette
...
@@ -450,7 +438,7 @@ peu comme si un mini-système d'exploitation démarrait, exécutait cette
commande et s'éteignait... C'est un peu pénible d'avoir à toujours
commande et s'éteignait... C'est un peu pénible d'avoir à toujours
préfixer par =docker run=, donc une solution simple consiste à lancer
préfixer par =docker run=, donc une solution simple consiste à lancer
docker en mode interactif.
docker en mode interactif.
** Docker en interactif
*** Docker en interactif
À partir de maintenant, il vous faudra bien faire attention à
À partir de maintenant, il vous faudra bien faire attention à
distinguer les commandes qui sont lancées sur mon système de base de
distinguer les commandes qui sont lancées sur mon système de base de
celles qui sont lancées dans notre conteneur docker.
celles qui sont lancées dans notre conteneur docker.
...
@@ -647,7 +635,7 @@ python3 --version
...
@@ -647,7 +635,7 @@ python3 --version
#+RESULTS:
#+RESULTS:
: Python 3.7.2rc1
: Python 3.7.2rc1
** Installer tous les paquets dont on a besoin
*** Installer tous les paquets dont on a besoin
Bien, j'ai python3 mais ça ne suffira pas pour exécuter mon notebook. Il me
Bien, j'ai python3 mais ça ne suffira pas pour exécuter mon notebook. Il me
faudra aussi bien sûr =jupyter= et différents paquets comme =matplotlib=,
faudra aussi bien sûr =jupyter= et différents paquets comme =matplotlib=,