Wie erstelle ich ein benanntes und aktuelles Tag in Docker?

241

Angenommen, ich habe ein Bild, als das ich markieren möchte 0.10.24(in meinem Fall ist es ein Bild, das Node.js 0.10.24 enthält). Ich habe dieses Image mit einer Docker-Datei erstellt und ausgeführt docker buildund ein Tag mithilfe des -tParameters bereitgestellt .

Ich gehe davon aus, dass ich eines Tages zusätzliche Versionen dieses Bildes haben werde, also werde ich den Prozess erneut ausführen, nur mit einem anderen Tag-Namen.

So weit, ist es gut. Das funktioniert super und gut und alles ist gut.

Aber, und hier fangen Probleme an, ich möchte auch immer die neueste Image-Anzeige latestzusätzlich haben. Ich muss also dem gleichen Bild zwei Namen geben.

Wie mache ich das? Muss ich wirklich docker buildgenau dieselbe Version erneut ausführen , aber dieses Mal ein anderes Tag verwenden, gibt es eine bessere Option?

Golo Roden
quelle
Verwandte Frage: stackoverflow.com/questions/21928780/…
Mark Butler

Antworten:

267

Sie können beim Erstellen des Bildes mehrere Tags verwenden:

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

Referenz: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t

Tommy
quelle
23
Sie können den :latestTeil auch weglassen, da dies die Standardeinstellung ist:docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .
TemporalWolf
161

Sobald Sie Ihr Bild haben, können Sie verwenden

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Erstellen und kennzeichnen Sie das Bild mit creack / node: latest

    $ ID=$(docker build -q -t creack/node .)
    
  2. Fügen Sie ein neues Tag hinzu

    $ docker tag $ID creack/node:0.10.24
    
  3. Sie können dies verwenden und den Teil -t vom Build überspringen

    $ docker tag $ID creack/node:latest
    
knarren
quelle
4
Das scheint nicht mehr zu funktionieren? Der Build-Befehl gibt nicht die Image-ID zurück, ID enthält das gesamte Build-Protokoll
Nicolas Mommaerts
14
Die Build-Protokolle sollen auf stderr sein, Sie können einen Bugreport auf github öffnen. Andernfalls können Sie beim Erstellen mit -t das angegebene Tag direkt verwenden und die Image-ID insgesamt verwerfen. In meinem Beispiel erzeugt die erste Zeile ein Bild creack/node:latest, das Sie dann mitdocker tag creack/node:latest creack/node:0.10.24
creack
Dies funktioniert gut mit so etwas wieREV=$(hg identify --num)
analytik
2
Damit das neueste Tag ordnungsgemäß funktioniert, sollten Sie wahrscheinlich docker tag -f $ID creack/node:latestdas Tagging mit dem neuesten erzwingen (falls ein vorheriges Bild bereits das neueste war)
treaz
4
Verwenden Sie: ID = $ (Docker-Build -q -t myrepo / myname: mytag.). Das "-q" bedeutet, dass nur die ID in stdout geschrieben wird. Sie sollten immer ein Tag angeben, als ob das Tag "Neueste" nicht verwendet wird, selbst wenn Sie einen alten Zweig erstellen.
David Roussel
44

Hier ist mein Bash-Skript

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

Sie können dann Bilder ohne Tags entfernen, wenn Sie dieselbe Version mit neu erstellt haben

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

Verknüpfung

oder

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

oder

Bereinigungsbefehle :

Docker 1.13 führt Bereinigungsbefehle ein. So entfernen Sie alle nicht verwendeten Container, Images, Netzwerke und Volumes:

docker system prune

oder einzeln:

docker container prune
docker image prune
docker network prune
docker volume prune
2Fast2BCn
quelle
Auf meinem Computer (Ubuntu 14.04) awk '{print $3}'funktioniert, aber nicht awk "{print $3}"so, der Befehl, den ich benutze, istdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
grimmig
1
Die -fOption existiert nicht mehr in docker tag. Verwendung ist nurdocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack
@ 2Fast2BCn: Angenommen, Sie müssen auch docker pushnach docker build & docker run, pushen Sie mit :latestoder ${VERSION}?
Idan Adar
Sie können beide schieben, denke ich. Es wird es sowieso nur einmal speichern.
2Fast2BCn
19

ID=$(docker build -t creack/node .) funktioniert seitdem nicht mehr bei mir ID es die Ausgabe des Builds enthält.

Also benutze ich dieses kleine BASH-Skript:

#!/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
quelle
1
Oder Sie können einfach passieren -q/ --quietzu buildwie in erwähnt diese Antwort
driftcatcher
8

Grep einfach die ID von 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

Benötigt keine temporäre Datei und liefert die vollständige Build-Ausgabe . Sie können es weiterhin in /dev/nulleine Protokolldatei umleiten .

Pierre-Alexis de Solminihac
quelle
5

Variation von Aarons Antwort. Verwendung von sed ohne temporäre Dateien

#!/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
quelle