Come creare tag con nome e ultimo in Docker?


241

Supponiamo di avere un'immagine che voglio taggare come 0.10.24(nel mio caso è un'immagine contenente Node.js 0.10.24). Ho creato quell'immagine usando un Dockerfile ed eseguendo docker builde fornendo un tag usando il -tparametro.

Mi aspetto che un giorno avrò versioni aggiuntive di quell'immagine, quindi eseguirò nuovamente il processo, solo con un altro nome di tag.

Fin qui tutto bene. Funziona benissimo e tutto va bene.

Ma, ed è qui che iniziano i problemi, voglio anche avere sempre l'immagine più recente taggata come annuncio latestaggiuntivo. Quindi credo di dover dare due nomi alla stessa immagine.

Come faccio a fare questo? Devo davvero rieseguire docker buildla stessa versione, ma questa volta utilizzare un altro tag, esiste un'opzione migliore?


Risposte:



161

Una volta che hai la tua immagine, puoi usarla

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Costruisci e tagga l'immagine con creack / node: latest

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

    $ docker tag $ID creack/node:0.10.24
    
  3. Puoi usarlo e saltare la parte -t ​​dalla build

    $ docker tag $ID creack/node:latest
    

4
Questo non sembra funzionare più? Il comando build non restituisce l'id dell'immagine, ID contiene l'intero registro di build
— Nicolas Mommaerts,

14
I log di compilazione dovrebbero essere su stderr, puoi aprire un bugreport su github. Altrimenti, quando costruisci con -t, puoi usare direttamente il tag dato e scartare del tutto l'id dell'immagine. Nel mio esempio, la prima riga produce un'immagine creack/node:latest, quindi puoi docker tag creack/node:latest creack/node:0.10.24
— taggarla

Funziona bene con qualcosa del genereREV=$(hg identify --num)
— analytik,

2
Per far funzionare correttamente l'ultimo tag, probabilmente vorrai farlo docker tag -f $ID creack/node:latestper forzare il tagging con latest (nel caso in cui un'immagine precedente fosse già più recente)
— treaz

4
Utilizzare: ID = $ (finestra mobile build -q -t myrepo / myname: mytag.). "-Q" significa che solo l'ID viene scritto su stdout. Dovresti sempre specificare un tag, come se non venissi usato il tag 'latest', anche se stai costruendo un vecchio ramo.
— David Roussel,

44

Ecco il mio script bash

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

Puoi quindi rimuovere le immagini senza tag se hai ricostruito la stessa versione con

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

collegamento

o

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

o

Comandi di pulizia :

Docker 1.13 introduce comandi di pulizia. Per rimuovere tutti i contenitori, immagini, reti e volumi non utilizzati:

docker system prune

o individualmente:

docker container prune
docker image prune
docker network prune
docker volume prune

Sulla mia macchina (Ubuntu 14.04) awk '{print $3}'funziona ma non è awk "{print $3}"così il comando che uso èdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
— torvo

1
l' -fopzione non esiste più in docker tag. L'utilizzo è solodocker tag IMAGE[:TAG] IMAGE[:TAG]
— jwadsack il

@ 2Fast2BCn: Supponendo che tu debba anche docker pushdopo docker build & docker run, spingi con :latesto ${VERSION}?
— Idan Adar,

Puoi spingere entrambi immagino. Lo memorizzerà solo una volta comunque.
— Fast2BCn

19

ID=$(docker build -t creack/node .) non funziona per me da allora ID conterrà l'output dalla build.

Quindi sto usando questo piccolo 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

1
Oppure puoi semplicemente passare -q/ --quieta buildcome indicato in questa risposta
— driftcatcher,

8

Basta greppare l'ID da 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

Non necessita di file temporanei e fornisce un output completo . Puoi ancora reindirizzarlo a /dev/nullo a un file di registro.


5

Variazione della risposta di Aaron. Utilizzo di sed senza file temporanei

#!/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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.