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.