Artefact
Objectifs
- Comprendre la notion de paquet et d'artefact
- Comprendre le fonctionnement d'un conteneur
- Dockeriser une application
Cours
ArtefactDevOps
Cycle de vie d'un programme
Package
Contrat entre le développeur et l'opérateur
Format de livraison
Exemples
.jar, .war, .ear (Java)
.apk (Android)
.exe, .dll (Windows)
.html, .css, .js (Web)
Dépendances
Besoin de libraries externes ?
Comment les gérer et les distribuer ?
Gestionnaire de paquets
Fichier de configuration (liste des dépendances)
pom.xml (Maven)
package.json (npm)
Gestionnaire de paquets
Maven, Gradle (Java)
npm, pnpm, yarn (Node.js)
APT (Advanced Packaging Tool) (Linux)
pip, Poetry (Python)
Dependency
Configuration
Comment run le programme ?
Quel OS ?
Quelle version ?
Quelle commande ?
Quels arguments ?
Mieux qu'un paquet ?
Souhait : Code + Dépendances + Configuration
Solution 1 : Machine virtuelle ?
Problème : lourd et lent
Solution 2 : OS-level virtualization (Conteneur)
Conteneur vs machine virtuelle
Conteneur
Partage le noyau de l'OS
Isolation des ressources (fichiers, processus, ...)
Léger (distribution) et rapide (démarrage)
Docker (leader)
Entreprise privée
Construit sur des technologies pré-existante (namespaces, cgroups, ...)
Podman (alternative)
Projet open-source
Conteneur
https://commons.wikimedia.org/wiki/File:Docker-linux-interfaces.svg
Conteneur
https://jfrog.com/devops-tools/article/understanding-and-building-docker-images/
Dockerfile
FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./your-daemon-or-script.py" ]
Recette pour construire une image
Bonnes pratiques sur le site de Docker
Couches
https://docs.docker.com/build/cache/
Image = couches de diff de fichiers
Cache des couches
https://docs.docker.com/build/cache/
Ordre des couches pour le cache
Du plus stable (dépendances) au plus volatile (code)
Container
https://docs.docker.com/engine/storage/drivers/
Partage des couches entre les containers
Multi-stage builds
FROM maven:3.5.0-jdk-8-alpine AS builder
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package
FROM openjdk:8-jre-alpine
COPY --from=builder target/my-app.jar my-app.jar
EXPOSE 8080
CMD ["java", "-jar", "my-app.jar"]
Compiler dans une image
Plus léger (pas de JDK dans l'image finale)
Réutiliser des couches
Taille des images
Taille de l'image = somme des couches
Inclure que les fichiers nécessaire
Utiliser les multi-stage builds
Préférer la version alpine des images (Alpine Linux)
python:3.11
~360 Mopython:3.11-alpine
~18 Mo
Moins de packages pré-installés
Parfois des problèmes de compatibilité
Dockerignore
Lors d'un build :
docker build -t my-image .
Envoi de tous les fichiers du context (répertoire courant) au daemon
Utiliser un fichier .dockerignore pour exclure des fichiers -> build plus rapide
# Ignore all files
*
# Allow files and directories
!src/
!pom.xml
Comment animer un dîner de codeurs
https://www.commitstrip.com/fr/2016/06/24/how-to-host-a-coder-dinner-party/
Docker Hub
Registre d'images Docker
Public et privé (payant)
Préférez les images officielles
Artefact
Résultat d'un build
Terme générique (pas de format spécifique) du paquet
Artefact vs Package
Gestionnaire d'artefacts
Version OSS (open-source software)
Version payante plus complète que Nexus
Versioning
MAJOR.MINOR.PATCH
1.0.0
1.0.1
(bug fix)1.1.0
(new feature)2.0.0
(breaking change)Utilisé par les gestionnaires de paquets
^1.0.0
(>= 1.0.0 < 2.0.0)~1.0.0
(>= 1.0.0 < 1.1.0)
Docker Image Tag
latest
Par défaut si non spécifié
1.3.2
Spécifique à une version précise
Pas de mise à jour des patch de sécurité automatiquement
1.3
Spécifique à une version minor
Recommandé car stable et sécurisé
Selon les projets, plutôt fixer la version major
Fichier lock
Verrouille les versions des dépendances
Exemples
package-lock.json
(npm)poetry.lock
(Poetry)
À versionner dans le dépôt de code
Versions sans animation, plein écran, imprimable.