Jak utworzyć nazwany i najnowszy tag w Docker?

241

Załóżmy, że mam obraz, który chcę oznaczyć jako 0.10.24(w moim przypadku jest to obraz zawierający Node.js 0.10.24). Zbudowałem ten obraz przy użyciu pliku Docker i wykonując docker buildgo, podając tag przy użyciu -tparametru.

Oczekuję, że pewnego dnia będę mieć dodatkowe wersje tego obrazu, więc ponownie uruchomię proces, z inną nazwą tagu.

Na razie w porządku. Działa to świetnie i wszystko jest w porządku.

Ale i tu zaczynają się problemy, chcę też zawsze mieć latestdodatkowo reklamę z najnowszym obrazem . Myślę, że muszę nadać dwa nazwy temu samemu obrazowi.

Jak mam to zrobic? Czy naprawdę muszę ponownie uruchomić docker builddokładnie tę samą wersję, ale tym razem użyj innego tagu, czy jest lepsza opcja?

Golo Roden
źródło
Powiązane pytanie: stackoverflow.com/questions/21928780/…
Mark Butler

Odpowiedzi:

161

Gdy masz już obraz, możesz go użyć

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Zbuduj i oznacz obraz za pomocą creack / node: latest

    $ ID=$(docker build -q -t creack/node .)
    
  2. Dodaj nowy tag

    $ docker tag $ID creack/node:0.10.24
    
  3. Możesz tego użyć i pominąć część -t z kompilacji

    $ docker tag $ID creack/node:latest
    
skrzyp
źródło
4
To już nie działa? Komenda kompilacji nie zwraca identyfikatora obrazu, identyfikator zawiera cały dziennik kompilacji
Nicolas Mommaerts
14
Dzienniki kompilacji powinny znajdować się na stderr, możesz otworzyć raport błędów na github. W przeciwnym razie, kiedy budujesz z -t, możesz użyć bezpośrednio podanego tagu i całkowicie odrzucić id obrazu. W moim przykładzie pierwsza linia tworzy obraz creack/node:latest, a następnie możesz go otagowaćdocker tag creack/node:latest creack/node:0.10.24
creack
Działa to dobrze z czymś takimREV=$(hg identify --num)
analytik
2
Aby najnowszy tag działał poprawnie, prawdopodobnie będziesz chciał to zrobić docker tag -f $ID creack/node:latest, aby wymusić tagowanie najnowszym (w przypadku, gdy poprzedni obraz był już najnowszy)
treaz
4
Użyj: ID = $ (kompilacja dokera -q -t mojarepo / moja_nazwa: mytag.). „-Q” oznacza, że ​​tylko ID jest zapisywane na standardowe wyjście. Zawsze powinieneś określać tag, tak jakbyś nie używał tagu „najnowszy”, nawet jeśli budujesz starą gałąź.
David Roussel,
44

Oto mój skrypt bash

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

Następnie możesz usunąć nieoznaczone obrazy, jeśli przebudowałeś tę samą wersję

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

połączyć

lub

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

lub

Polecenia czyszczenia :

Docker 1.13 wprowadza polecenia czyszczenia. Aby usunąć wszystkie nieużywane pojemniki, obrazy, sieci i woluminy:

docker system prune

lub indywidualnie:

docker container prune
docker image prune
docker network prune
docker volume prune
2 Fast2BCn
źródło
Na mojej maszynie (Ubuntu 14.04) awk '{print $3}'działa, ale nie awk "{print $3}"tak, że polecenie, którego używam todocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
grim
1
-fopcja nie istnieje docker tag. Użycie jest po prostudocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack
@ 2Fast2BCn: Zakładając, że musisz to zrobić docker pushpóźniej docker build & docker run, czy naciskasz za pomocą :latestczy ${VERSION}?
Idan Adar
Myślę, że możesz popchnąć oba. W każdym razie będzie go przechowywać tylko raz.
2Fast2BCn
19

ID=$(docker build -t creack/node .)nie działa dla mnie, ponieważ IDbędzie zawierać dane wyjściowe z kompilacji.

Więc używam tego małego skryptu 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
źródło
1
Lub możesz po prostu przekazać -q/ --quietdo, buildjak wspomniano w tej odpowiedzi
driftcatcher
8

Po prostu grep identyfikator z 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

Nie wymaga pliku tymczasowego i daje pełne wyjście kompilacji . Nadal możesz przekierować go do /dev/nullpliku dziennika.

Pierre-Alexis de Solminihac
źródło
5

Wariacja odpowiedzi Aarona. Używanie sed bez plików tymczasowych

#!/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
źródło