Comment créer une balise nommée et la plus récente dans Docker?

241

Supposons que j'ai une image que je souhaite étiqueter 0.10.24(dans mon cas, c'est une image contenant Node.js 0.10.24). J'ai construit cette image en utilisant un Dockerfile et en l'exécutant docker buildet en fournissant une balise en utilisant le -tparamètre.

Je m'attends à ce qu'un jour, j'aurai des versions supplémentaires de cette image, donc je vais relancer le processus, juste avec 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 également toujours avoir la plus récente annonce balisée avec image latest. Je suppose donc que je dois donner deux noms à la même image.

Comment puis-je faire cela? Ai-je vraiment besoin de réexécuter docker buildsur la même version exacte, mais cette fois, utilisez une autre balise, existe-t-il une meilleure option?

Golo Roden
la source
Question connexe: stackoverflow.com/questions/21928780/…
Mark Butler

Réponses:

267

Vous pouvez avoir plusieurs balises 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

Tommy
la source
23
vous pouvez également laisser la :latestpartie, car c'est la valeur par défaut:docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .
TemporalWolf
161

Une fois que vous avez votre image, vous pouvez utiliser

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Créez et marquez l'image avec creack / node: dernier

    $ ID=$(docker build -q -t creack/node .)
    
  2. Ajouter une nouvelle balise

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

    $ docker tag $ID creack/node:latest
    
creack
la source
4
Cela ne semble plus fonctionner? La commande build ne renvoie pas l'id de l'image, l'ID contient le journal de build entier
Nicolas Mommaerts
14
Les journaux de build sont censés être sur stderr, vous pouvez ouvrir un rapport de bug sur github. Sinon, lorsque vous construisez avec -t, vous pouvez utiliser directement la balise donnée et ignorer complètement l'identifiant de l'image. Dans mon exemple, la première ligne produit une image creack/node:latest, vous pouvez ensuite la marquer avecdocker tag creack/node:latest creack/node:0.10.24
creack
Cela fonctionne bien avec quelque chose commeREV=$(hg identify --num)
analytik
2
Pour que la dernière balise fonctionne correctement, vous voudrez probablement le faire docker tag -f $ID creack/node:latestafin de forcer le balisage avec la dernière (dans le cas où une image précédente était déjà la plus récente)
treaz
4
Utilisez: ID = $ (docker build -q -t myrepo / myname: mytag.). Le "-q" signifie que seul l'ID est écrit sur stdout. Vous devez toujours spécifier une balise, comme si vous ne l'utilisiez pas, la dernière balise sera utilisée, même si vous construisez une ancienne branche.
David Roussel
44

Voici mon script bash

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

Vous pouvez ensuite supprimer les images non balisées si vous avez reconstruit 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
2Fast2BCn
la source
Sur ma machine (Ubuntu 14.04) awk '{print $3}'fonctionne mais pas awk "{print $3}"si la commande que j'utilise estdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
sinistre
1
l' -foption n'existe plus dans docker tag. L'utilisation est justedocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack
@ 2Fast2BCn: En supposant que vous deviez également le faire docker pushaprès docker build & docker run, appuyez-vous avec :latestou ${VERSION}?
Idan Adar
Vous pouvez pousser les deux, je suppose. De toute façon, il ne le stockera qu'une seule fois.
2Fast2BCn
19

ID=$(docker build -t creack/node .) ne fonctionne pas pour moi depuis ID contiendra la sortie 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
Aaron Digulla
la source
1
Ou vous pouvez simplement passer -q/ --quietà buildcomme mentionné dans cette réponse
driftcatcher
8

Saisissez simplement l'ID 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

Ne nécessite aucun fichier temporaire et donne une sortie de génération complète . Vous pouvez toujours le rediriger vers /dev/nullou vers un fichier journal.

Pierre-Alexis de Solminihac
la source
5

Variation de la réponse d'Aaron. Utilisation de 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
Tony
la source