« Docker history » : différence entre les versions

Page créée avec « La commande **`docker history mon-image:latest`** affiche les couches (layers) qui composent une image Docker, ainsi que leur taille et les commandes qui les ont générées. C'est très utile pour : 1. **Comprendre la construction de l'image** Chaque ligne correspond à une instruction dans le `Dockerfile` (ex: `RUN`, `COPY`, `ENV`). 2. **Identifier les couches les plus volumineuses** Pour optimiser la taille de l'image (ex: repérer une installation... »
 
Aucun résumé des modifications
 
Ligne 1 : Ligne 1 :
La commande **`docker history mon-image:latest`** affiche les couches (layers) qui composent une image Docker, ainsi que leur taille et les commandes qui les ont générées. C'est très utile pour :
La commande '''<code>docker history mon-image:latest</code>''' affiche les couches (layers) qui composent une image Docker, ainsi que leur taille et les commandes qui les ont générées. C’est très utile pour :


1. **Comprendre la construction de l'image** 
# '''Comprendre la construction de l’image'''<br />
  Chaque ligne correspond à une instruction dans le `Dockerfile` (ex: `RUN`, `COPY`, `ENV`).
Chaque ligne correspond à une instruction dans le <code>Dockerfile</code> (ex: <code>RUN</code>, <code>COPY</code>, <code>ENV</code>).
# '''Identifier les couches les plus volumineuses'''<br />
Pour optimiser la taille de l’image (ex: repérer une installation inutilement lourde).
# '''Déboguer des problèmes'''<br />
Retracer les modifications apportées à l’image.


2. **Identifier les couches les plus volumineuses** 
  Pour optimiser la taille de l'image (ex: repérer une installation inutilement lourde).


3. **Déboguer des problèmes** 
-----
  Retracer les modifications apportées à l’image.


---
<span id="exemple-de-sortie"></span>
=== '''Exemple de sortie''' ===


### **Exemple de sortie**
<syntaxhighlight lang="bash">IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
```bash
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
a1b2c3d4e5f6  2 minutes ago  /bin/sh -c apt-get install -y python3          150MB     
a1b2c3d4e5f6  2 minutes ago  /bin/sh -c apt-get install -y python3          150MB     
f6e5d4c3b2a1  5 minutes ago  /bin/sh -c apt-get update && apt-get upgrade  50MB       
f6e5d4c3b2a1  5 minutes ago  /bin/sh -c apt-get update && apt-get upgrade  50MB       
123456789abc  1 hour ago      /bin/sh -c #(nop)  ENV PYTHONUNBUFFERED=1      0B         
123456789abc  1 hour ago      /bin/sh -c #(nop)  ENV PYTHONUNBUFFERED=1      0B         
789abc123def  1 week ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]          0B         
789abc123def  1 week ago      /bin/sh -c #(nop)  CMD ["/bin/bash"]          0B         
def123abc456  1 week ago      /bin/sh -c #(nop) ADD file:123...in /          120MB     
def123abc456  1 week ago      /bin/sh -c #(nop) ADD file:123...in /          120MB    </syntaxhighlight>
```


---
-----


### **Clés à retenir**
<span id="clés-à-retenir"></span>
- **`SIZE`** : Taille ajoutée par chaque couche. 
=== '''Clés à retenir''' ===
  *Les lignes avec `0B` sont des métadonnées (ex: `ENV`, `CMD`).*
- **`CREATED BY`** : Commande exécutée pour créer la couche. 
  *Les commandes tronquées peuvent être affichées en entier avec `--no-trunc`.*
- **`IMAGE`** : ID de la couche intermédiaire (souvent inutile sauf pour du debug avancé).


---
* '''<code>SIZE</code>''' : Taille ajoutée par chaque couche.<br />
''Les lignes avec <code>0B</code> sont des métadonnées (ex: <code>ENV</code>, <code>CMD</code>).''
* '''<code>CREATED BY</code>''' : Commande exécutée pour créer la couche.<br />
''Les commandes tronquées peuvent être affichées en entier avec <code>--no-trunc</code>.''
* '''<code>IMAGE</code>''' : ID de la couche intermédiaire (souvent inutile sauf pour du debug avancé).


### **Options utiles**
| Option              | Description                                                                |
|----------------------|-----------------------------------------------------------------------------|
| `--no-trunc`        | Affiche les commandes complètes (non tronquées). Ex: `docker history --no-trunc mon-image:latest` |
| `--format "{{.ID}}\t{{.CreatedBy}}\t{{.Size}}"` | Formatage personnalisé (ex: pour extraire des données). |
| `--human=true`      | Affiche les tailles en format lisible (Mo, Go) *(activé par défaut)*.      |


---
-----


### **Exemple d'optimisation**
<span id="options-utiles"></span>
Si vous voyez une couche `RUN apt-get install` très volumineuse, vous pouvez : 
=== '''Options utiles''' ===
- **Fusionner les commandes** dans un seul `RUN` pour réduire les couches. 
- **Nettoyer les caches** dans la même instruction (ex: `apt-get clean`). 


**Dockerfile optimisé :**
{|
```dockerfile
!width="22%"| Option
RUN apt-get update \
!width="77%"| Description
|-
| <code>--no-trunc</code>
| Affiche les commandes complètes (non tronquées). Ex: <code>docker history --no-trunc mon-image:latest</code>
|-
| <code>--format &quot;{{.ID}}\t{{.CreatedBy}}\t{{.Size}}&quot;</code>
| Formatage personnalisé (ex: pour extraire des données).
|-
| <code>--human=true</code>
| Affiche les tailles en format lisible (Mo, Go) ''(activé par défaut)''.
|}
 
 
-----
 
<span id="exemple-doptimisation"></span>
=== '''Exemple d’optimisation''' ===
 
Si vous voyez une couche <code>RUN apt-get install</code> très volumineuse, vous pouvez :<br />
- '''Fusionner les commandes''' dans un seul <code>RUN</code> pour réduire les couches.<br />
- '''Nettoyer les caches''' dans la même instruction (ex: <code>apt-get clean</code>).
 
'''Dockerfile optimisé :'''
 
<syntaxhighlight lang="dockerfile">RUN apt-get update \
     && apt-get install -y python3 \
     && apt-get install -y python3 \
     && apt-get clean \
     && apt-get clean \
     && rm -rf /var/lib/apt/lists/*
     && rm -rf /var/lib/apt/lists/*</syntaxhighlight>
```
 
-----
 
<span id="différence-avec-docker-inspect"></span>
=== '''Différence avec <code>docker inspect</code>''' ===
 
* <code>docker history</code> → '''Couches de construction''' (empilement des instructions).<br />


---
* <code>docker inspect</code> → '''Métadonnées globales''' (taille totale, variables, ports, etc.).


### **Différence avec `docker inspect`**
Pour voir la taille totale de l’image :
- `docker history` → **Couches de construction** (empilement des instructions). 
- `docker inspect` → **Métadonnées globales** (taille totale, variables, ports, etc.). 


Pour voir la taille totale de l’image : 
<syntaxhighlight lang="bash">docker inspect mon-image:latest --format='{{.Size}}' | numfmt --to=iec</syntaxhighlight>
```bash
docker inspect mon-image:latest --format='{{.Size}}' | numfmt --to=iec
```


[[Catégorie:Docker]]
[[Catégorie:Docker]]