web-dev-qa-db-fra.com

Docker build command avec --tag impossible de marquer les images

J'ai essayé de construire une image Docker en utilisant un Dockerfile disponible localement.

docker build -t newimage .

J'ai également utilisé cette commande plusieurs fois plus tôt, mais en quelque sorte, cela ne fonctionne pas actuellement et je suis coincé à en trouver la raison.

Je serai vraiment utile si quelqu'un peut m'aider avec une solution possible ou un domaine possible pour rechercher un problème.

j'ai déjà jeté un coup d'œil sur d'autres articles qui auraient pu être liés par exemple: Docker build tag repository name

16
Harshil

D'accord! J'ai découvert la raison du problème.

PROCESSUS DE CONSTRUCTION DE QUAI

Lorsque nous construisons une image docker, lors de la création d'une image, plusieurs autres images intermédiaires sont générées dans le processus. On ne les voit jamais dans docker images car avec la génération de l'image intermédiaire suivante, l'image précédente est supprimée. Et à la fin, nous n'en avons qu'une qui est l'image finale.

La balise que nous fournissons en utilisant -t ou --tag est pour la version finale, et évidemment aucun conteneur intermédiaire n'est étiqueté avec le même.

EXPLICATION DU PROBLÈME

Lorsque nous essayons de créer une image Docker avec Dockerfile, le processus ne se termine pas toujours avec un message similaire comme Successfully built image with IMAGEID

Il est donc tellement évident que la construction qui a échoué ne sera pas répertoriée dans docker images

Maintenant, l'image avec la balise <none> est une autre image (intermédiaire). Cela crée une confusion selon laquelle l'image existe mais sans balise, mais l'image n'est en fait pas ce que la construction finale devrait être, donc pas balisée.

18
Harshil

L'une des solutions de contournement pour ce cas, exécutez la commande ci-dessous immédiatement après la commande de génération, si toutes les autres images ont déjà été testées.

docker tag $(docker image ls | grep "<none>" | awk '{print $3}') newimage:latest

Comme je sais, cela ne fonctionnera que sous Linux OS.

1
vugar_saleh

Il n'y a rien de mal avec Docker.

Une image peut avoir plusieurs balises:

Alpine    3.4      4e38e38c8ce0        6 weeks ago         4.799 MB
Alpine    latest   4e38e38c8ce0        6 weeks ago         4.799 MB

Dans cet exemple, l'image avec l'ID 4e38e38c8ce0 est tagué Alpine:latest et Alpine:3.4. Si vous deviez exécuter docker build -t Alpine . la balise latest serait supprimée de l'image 4e38e38c8ce0 et affecté à la nouvelle image (qui a un identifiant différent).

Si vous supprimez le dernier tag d'une image, l'image n'est pas supprimée automatiquement. Il apparaît comme <none>.

Docker utilise également un cache. Donc, si vous créez une image avec un Dockerfile, modifiez ce fichier, reconstruisez l'image et que vous annulez la modification et que vous reconstruisez à nouveau, vous aurez deux images - l'image que vous avez créée à la première et à la dernière étape est la même. La deuxième image sera "taguée" <none>.

Si vous souhaitez conserver plusieurs versions d'une image, utilisez docker build -ttag:versionimage:tag . où versiontag est modifié à chaque fois que vous apportez des modifications.

Edit : Ce que j'ai appelé tag est en fait le nom de l'image et ce que j'ai appelé version est appelé tag: https: //docs.docker .com/engine/reference/commandline/tag /

1
Martin