¿Cómo crear una etiqueta con nombre y la última en Docker?

241

Supongamos que tengo una imagen que quiero etiquetar 0.10.24(en mi caso es una imagen que contiene Node.js 0.10.24). Construí esa imagen usando un Dockerfile y ejecutándolo docker buildy proporcionando una etiqueta usando el -tparámetro.

Espero que algún día tenga versiones adicionales de esa imagen, así que volveré a ejecutar el proceso, solo con otro nombre de etiqueta.

Hasta aquí todo bien. Esto funciona muy bien y todo está bien.

Pero, y aquí es donde comienzan los problemas, también quiero tener siempre el anuncio etiquetado con la imagen más nueva latest. Así que supongo que necesito dar dos nombres a la misma imagen.

¿Cómo hago esto? ¿Realmente necesito volver a ejecutar docker buildexactamente la misma versión, pero esta vez use otra etiqueta, ¿hay una mejor opción?

Golo Roden
fuente
Pregunta relacionada: stackoverflow.com/questions/21928780/…
Mark Butler

Respuestas:

267

Puede tener varias etiquetas al crear la imagen:

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

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

Tommy
fuente
23
También puede dejar la :latestporción, ya que ese es el valor predeterminado:docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .
TemporalWolf
161

Una vez que tenga su imagen, puede usar

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Cree y etiquete la imagen con creack / node: último

    $ ID=$(docker build -q -t creack/node .)
    
  2. Agregar una nueva etiqueta

    $ docker tag $ID creack/node:0.10.24
    
  3. Puede usar esto y omitir la parte -t ​​de la compilación

    $ docker tag $ID creack/node:latest
    
crujir
fuente
44
¿Esto ya no parece funcionar? El comando de compilación no devuelve la identificación de la imagen, la ID contiene todo el registro de compilación
Nicolas Mommaerts
14
Se supone que los registros de compilación están en stderr, puede abrir un informe de errores en github. De lo contrario, cuando compila con -t, puede usar directamente la etiqueta dada y descartar por completo la identificación de la imagen. En mi ejemplo, la primera línea produce una imagen creack/node:latest, luego puedes etiquetarla condocker tag creack/node:latest creack/node:0.10.24
creack el
Esto funciona bien con algo asíREV=$(hg identify --num)
analytik
2
Para que la última etiqueta funcione correctamente, probablemente querrá hacerlo docker tag -f $ID creack/node:latestpara forzar el etiquetado con la última (en caso de que una imagen anterior ya fuera la última)
treaz
44
Use: ID = $ (docker build -q -t myrepo / myname: mytag.). El "-q" significa que solo la ID se escribe en stdout. Siempre debe especificar una etiqueta, como si no fuera así, se usará la etiqueta 'más reciente', incluso si está construyendo una rama antigua.
David Roussel
44

Aquí está mi script bash

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

Luego puede eliminar las imágenes sin etiquetar si reconstruyó la misma versión con

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

enlace

o

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

o

Comandos de limpieza :

Docker 1.13 presenta los comandos de limpieza. Para eliminar todos los contenedores, imágenes, redes y volúmenes no utilizados:

docker system prune

o individualmente:

docker container prune
docker image prune
docker network prune
docker volume prune
2Fast2BCn
fuente
En mi máquina (Ubuntu 14.04) awk '{print $3}'funciona, pero no awk "{print $3}"así que el comando que uso esdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
sombrío
1
la -fopción ya no existe en docker tag. El uso es justodocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack
@ 2Fast2BCn: Suponiendo que también necesita hacerlo docker pushdespués docker build & docker run, ¿empuja con :latesto ${VERSION}?
Idan Adar
Puedes empujar a los dos, supongo. Lo almacenará solo una vez de todos modos.
2Fast2BCn
19

ID=$(docker build -t creack/node .)no funciona para mí ya IDque contendrá el resultado de la compilación.

Así que estoy usando este pequeño 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
fuente
1
O simplemente puede pasar -q/ --quieta buildcomo se menciona en esta respuesta
driftcatcher
8

Simplemente grep la identificación 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

No necesita ningún archivo temporal y proporciona una salida de compilación completa . Todavía puede redirigirlo a /dev/nullun archivo de registro.

Pierre-Alexis de Solminihac
fuente
5

Variación de la respuesta de Aaron. Usando sed sin archivos temporales

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