web-dev-qa-db-fra.com

Comment créer une étiquette nommée et la dernière dans Docker?

Supposons que j'ai une image que je veux étiqueter comme 0.10.24 (dans mon cas, c'est une image contenant Node.js 0.10.24). J'ai construit cette image en utilisant un fichier Docker et en exécutant docker build et en fournissant une balise à l'aide du paramètre -t.

Je pense qu'un jour, j'aurai des versions supplémentaires de cette image. Je vais donc réexécuter le processus, avec simplement un autre nom de balise.

Jusqu'ici tout va bien. Cela fonctionne très bien et tout va bien.

Mais, et c’est là que les problèmes commencent, je veux aussi toujours avoir en plus la dernière image étiquetée ad latest. Je suppose donc que je dois donner deux noms à la même image.

Comment puis-je faire cela? Dois-je vraiment ré-exécuter docker build sur la même version, mais cette fois-ci, utilisez une autre balise. Existe-t-il une meilleure option?

200
Golo Roden

Vous pouvez avoir plusieurs tags lors de la création de l'image:

$ docker build -t whenry/Fedora-jboss:latest -t whenry/Fedora-jboss:v2.1 .

Référence: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t

201
Tommy

Une fois que vous avez votre image, vous pouvez utiliser

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Construire et marquer l'image avec creack/node: dernière

    $ ID=$(docker build -q -t creack/node .)
    
  2. Ajouter un nouveau tag

    $ docker tag $ID creack/node:0.10.24
    
  3. Vous pouvez utiliser ceci et ignorer la partie -t de la construction

    $ docker tag $ID creack/node:latest
    
149
creack

Voici mon script bash

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

Vous pouvez ensuite supprimer les images sans étiquette si vous reconstruisez la même version avec

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

lien

ou

docker rmi $(docker images | grep "^<none>" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

ou

Commandes de nettoyage :

Docker 1.13 introduit des commandes de nettoyage. Pour supprimer tous les conteneurs, images, réseaux et volumes inutilisés:

docker system Prune

ou individuellement:

docker container Prune
docker image Prune
docker network Prune
docker volume Prune
33
2Fast2BCn

ID=$(docker build -t creack/node .) ne fonctionne pas pour moi car ID contiendra le résultat de la construction.

J'utilise donc ce petit script BASH:

#!/bin/bash

set -o pipefail

IMAGE=...your image name...
VERSION=...the version...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/Java7/bin/Java -version
19
Aaron Digulla

Juste l'ID de grep de docker images:

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

Nécessite pas de fichier temporaire et donne sortie complète. Vous pouvez toujours le rediriger vers /dev/null ou un fichier journal.

Variation de la réponse d'Aaron. Utiliser sed sans fichiers temporaires

#!/bin/bash
VERSION=1.0.0
IMAGE=company/image
ID=$(docker build  -t ${IMAGE}  .  | tail -1 | sed 's/.*Successfully built \(.*\)$/\1/')

docker tag ${ID} ${IMAGE}:${VERSION}
docker tag -f ${ID} ${IMAGE}:latest
5
Tony