Comment ajouter, remplacer et supprimer les balises d’image Docker

By Matthieu CHARRIER

Docker utilise des balises pour identifier les différentes versions d’une image. Comme dans la communauté des conteneurs, les balises doivent être utilisées pour marquer chaque version afin que les utilisateurs puissent choisir entre les différentes versions.

Les balises peuvent également être utilisées pour décrire d’autres caractéristiques d’une image, comme l’identité d’une dépendance clé lorsque plusieurs options sont proposées. Il n’est pas rare que les fournisseurs d’images proposent ce type de balises :

exemple-image:1.1.0-apache
exemple-image:1.1.0-nginx
exemple-image:1.2.0-apache
exemple-image:1.2.0-nginx

Ce schéma de balises vous permet de choisir entre différentes versions de l’image tout en proposant Apache ou NGINX comme base de l’image.

Vous pouvez ajouter vos propres balises à toute image que vous construisez ou tirez. Les balises locales vous permettent d’identifier rapidement des images spécifiques à l’avenir. Dans ce guide, nous allons vous montrer comment gérer les balises d’image avec l’interface CLI de Docker.

Ajout de balises

Les balises sont ajoutées aux images à l’aide de la commande docker tag. Les balises peuvent également être attachées lorsque vous construisez une image avec docker build en passant l’indicateur -t.

La commande tag prend deux arguments : une balise existante identifiant une image et une nouvelle balise  » cible  » à affecter à cette image :

docker tag

docker tag exemple-image:1.1.0 exemple-image:1.1.0-apache

Les deux balises feront désormais référence à la même image, vous pouvez donc commencer à les utiliser de manière interchangeable. Cependant, l’exécution de docker pull example-image:1.1.0 n’affectera pas la balise 1.1.0-apache. La référence d’image d’une balise n’est pas mise à jour, sauf si vous l’avez incluse manuellement dans une commande CLI.

A lire également :  Moby et son rapport avec Docker

La seule exception à cette règle est la balise latest, souvent mal comprise. Lorsque vous tirez une image  » nue  » sans balise, comme docker pull example-image, Docker utilise implicitement latest.

Pour aller plus loin : Utiliser Docker et les conteneurs

Images non balisées

La commande docker tag accepte les identifiants d’image comme référence source au lieu d’une balise existante. Si vous vous retrouvez avec une image non étiquetée, exécutez la commande docker images pour trouver son ID, puis utilisez docker tag pour lui attribuer une nouvelle étiquette :

docker tag 0e3e06b48755 exemple-image:latest

Il est possible d’avoir des images non étiquetées lorsque vous tirez une nouvelle version d’une étiquette :

a déjà example-image:latest

docker pull exemple-image:latest

La cible originale de la balise example-image:latest existe toujours sur votre système mais n’est plus balisée. La commande pull a téléchargé les nouvelles données de l’image et a réaffecté la dernière balise pour la référencer.

Utilisation de balises pour pousser des images

L’ajout d’une nouvelle balise est nécessaire lorsque vous transférez des images entre des registres. L’URL du registre fait partie de la balise. Ajoutez une nouvelle balise qui inclut le registre vers lequel vous voulez pousser, puis utilisez docker push pour le télécharger :

docker tag exemple-image:latest registre.exemple.com/exemple-image:latest
docker push registry.example.com/example-image:latest

Pousser un tag nu sans composant URL enverra les données de l’image à Docker Hub. Par conséquent, vous devez ajouter une balise avec le nom d’hôte de votre serveur et le numéro de port facultatif lorsque vous interagissez avec un registre privé.

À lire également : Stratégies de déploiements de production automatisés Docker

A lire également :  Comment déployer PostgreSQL en tant que conteneur Docker

Remplacement et modification des balises

La commande docker tag remplace silencieusement la référence d’une balise si une balise existante est utilisée comme cible :

docker tag first-image:latest demo
docker tag second-image:latest demo

La balise demo fait maintenant référence à la seconde image et ne peut pas être utilisée pour référencer la première image. Vous pouvez toujours interagir avec la première image en utilisant sa balise restante, first-image:latest. La deuxième image peut être sélectionnée à l’aide de second-image:latest ou demo.

Les balises d’image doivent généralement être considérées comme immuables. Il est préférable d’éviter cette technique de modification de la référence d’une balise, sauf pour les balises que vous utilisez à des fins d’organisation locale. Ce n’est pas une bonne idée de pousser une balise mise à jour vers un registre public, car les utilisateurs qui dépendent de cette balise recevront une image modifiée de manière inattendue lors de leur prochain tirage. Dans ce cas, il est préférable de pousser une nouvelle balise.

Construire et pousser v1

docker build -t exemple-image:v1 .
docker push exemple-image:v1

v1 fait maintenant référence à des données d’image différentes

C’est bien pour un usage local (les balises dans le registre

registre sont indépendantes de vos balises locales).

docker build -t exemple-image:v1 .

Ne faites pas cela – maintenant la balise dans le registre

a été modifiée aussi, ce qui pourrait avoir un impact négatif

avoir un impact négatif sur les utilisateurs existants.

docker push exemple-image:v1

Suppression des balises

Vous pouvez supprimer les balises des images que vous avez transférées sur votre machine. Utilisez la commande docker rmi, en spécifiant la balise que vous souhaitez supprimer :

docker rmi exemple-image:1.1.0-apache

A lire également :  Comment déployer un serveur Web Caddy avec Docker

Toutes les autres balises référençant les mêmes données d’image resteront utilisables. Dans le cas où l’image référencée ne serait plus balisée, l’interface CLI de Docker supprime complètement les données de l’image. Cela permet de s’assurer que vous ne vous retrouvez pas avec des images non balisées à la suite d’instructions de suppression explicites.

La suppression d’une balise n’a d’effet que localement, même si vous faites référence à une balise qui inclut une URL de registre :

Ne supprime pas l’étiquette du registre !

docker rmi registry.example.com/example-image:latest

Actuellement, vous ne pouvez pas supprimer une balise spécifique d’un registre. Ceci est conforme au principe d’immuabilité des balises : une fois que vous avez poussé un contenu, il peut être utilisé comme dépendance par les consommateurs en aval, c’est pourquoi l’API de registre ne comporte pas de point de terminaison pour la suppression des balises.

Cependant, de nombreuses implémentations de registres tiers fournissent un mécanisme équivalent ; il est intéressant de vérifier la documentation du vôtre si vous avez une raison impérieuse de supprimer une balise poussée.

Résumé

Les balises sont utilisées pour étiqueter les images Docker avec des informations distinctives clés telles que leur version de construction et les dépendances incluses. Les étiquettes sont beaucoup plus simples à utiliser que les identifiants SHA des images que vous pouvez visualiser avec les images Docker. Les balises constituent également le principal mécanisme d’interaction avec les images dans les registres distants.

Vous pouvez gérer vos propres balises sur votre machine locale, mais les modifications n’affecteront pas le contenu du registre. Vous devez également tenir compte du fait que, bien que les balises soient mutables, il ne faut pas abuser de cette propriété et il vaut mieux l’éviter lorsque l’on pousse des balises vers un registre. Cela permet de protéger vos utilisateurs contre des modifications non souhaitées.