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?
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
Une fois que vous avez votre image, vous pouvez utiliser
$ docker tag <image> <newName>/<repoName>:<tagName>
Construire et marquer l'image avec creack/node: dernière
$ ID=$(docker build -q -t creack/node .)
Ajouter un nouveau tag
$ docker tag $ID creack/node:0.10.24
Vous pouvez utiliser ceci et ignorer la partie -t de la construction
$ docker tag $ID creack/node:latest
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}")
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
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
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