Como criar tags nomeadas e mais recentes no Docker?

241

Suponha que eu tenha uma imagem que eu queira marcar como 0.10.24(no meu caso, é uma imagem que contém o Node.js. 0.10.24). Criei essa imagem usando um Dockerfile e executando docker builde fornecendo uma tag usando o -tparâmetro

Espero que um dia eu tenha versões adicionais dessa imagem, portanto, executarei o processo novamente, apenas com outro nome de tag.

Por enquanto, tudo bem. Isso funciona muito bem e tudo está bem.

Mas, e é aí que os problemas começam, eu também quero sempre ter o anúncio mais recente com tags de imagem latest. Acho que preciso dar dois nomes para a mesma imagem.

Como eu faço isso? Eu realmente preciso executar docker buildnovamente a mesma versão exata novamente, mas desta vez usando outra tag, existe uma opção melhor?

Golo Roden
fonte
Pergunta relacionada: stackoverflow.com/questions/21928780/…
Mark Butler

Respostas:

161

Depois de ter sua imagem, você pode usar

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Crie e marque a imagem com creack / node: latest

    $ ID=$(docker build -q -t creack/node .)
    
  2. Adicione uma nova tag

    $ docker tag $ID creack/node:0.10.24
    
  3. Você pode usar isso e pular a parte -t ​​da compilação

    $ docker tag $ID creack/node:latest
    
creack
fonte
4
Isso parece não funcionar mais? O comando de compilação não retorna o ID de imagem, ID contém o log de construção inteira
Nicolas Mommaerts
14
Os logs de construção devem estar no stderr, você pode abrir um relatório de erros no github. Caso contrário, quando você construir com -t, poderá usar diretamente a tag fornecida e descartar completamente o ID da imagem. No meu exemplo, a primeira linha produz uma imagem creack/node:lateste você pode marcá-la comdocker tag creack/node:latest creack/node:0.10.24
creack
Isso funciona bem com algo comoREV=$(hg identify --num)
analytik
2
Para tornar o trabalho mais recente tag corretamente, você provavelmente vai querer fazer docker tag -f $ID creack/node:latest, a fim de forçar a marcação com o mais recente (no caso de uma imagem anterior já estava mais recente)
treaz
4
Use: ID = $ (janela de encaixe build -q -t myrepo / myname: mytag.). O "-q" significa que apenas o ID é gravado no stdout. Você sempre deve especificar uma tag, como se não a tag 'latest' seja usada, mesmo se estiver criando uma ramificação antiga.
David Roussel
44

Aqui está o meu script bash

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

Você pode remover imagens não marcadas se recriar a mesma versão com

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

ligação

ou

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

ou

Comandos de limpeza :

O Docker 1.13 apresenta comandos de limpeza. Para remover todos os contêineres, imagens, redes e volumes não utilizados:

docker system prune

ou individualmente:

docker container prune
docker image prune
docker network prune
docker volume prune
2Fast2BCn
fonte
Na minha máquina (Ubuntu 14.04) awk '{print $3}'funciona, mas não awk "{print $3}"por isso o uso de comando I édocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
sombria
1
a -fopção não existe mais em docker tag. O uso é justodocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack 26/10/16
@ 2Fast2BCn: Supondo que você também precise docker pushdepois docker build & docker run, você pressiona com :latestou ${VERSION}?
precisa
Você pode empurrar os dois, eu acho. De qualquer forma, ele será armazenado apenas uma vez.
2Fast2BCn
19

ID=$(docker build -t creack/node .)não funciona para mim, pois IDconterá a saída da compilação.

Então, eu estou usando este pequeno 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
fonte
1
Ou você pode simplesmente passar -q/ --quieta build, como mencionado no essa resposta
driftcatcher
8

Apenas grep o 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

Não precisa de arquivo temporário e fornece saída de compilação completa . Você ainda pode redirecioná-lo para /dev/nullou para um arquivo de log.

Pierre-Alexis de Solminihac
fonte
5

Variação da resposta de Aaron. Usando sed sem arquivos temporários

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