Aller au contenu principal

Artefact

Objectifs

  • Comprendre la notion de paquet et d'artefact
  • Comprendre le fonctionnement d'un conteneur
  • Dockeriser une application

Cours

Artefact

DevOps

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

https://xkcd.com/2347

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

https://www.docker.com/resources/what-container/

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" ]

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 Mo

    • python: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

  • hub.docker.com

  • 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

Versioning

  • Semantic 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

F pour passer en plein écran ou O pour afficher la vue d'ensemble.
Versions sans animation, plein écran, imprimable.

Références