He configurado un registro docker en un sistema remoto. Le he empujado algunas imágenes. Hice cambios en estas imágenes y quiero actualizarlas para que cuando las extraiga obtenga la versión más reciente. ¿Cómo puedo garantizar que siempre obtendré la última versión?
Traté de etiquetar mi imagen con: más reciente, pero eso no parece hacer nada. También me aseguré de que la imagen se construya de nuevo con el indicador --no-cache.
Esto es lo que hago en este momento:
Construyo una imagen a través de
docker image build --tag karaf .
Etiqueto esa imagen con
docker image tag karaf outserver.at:5000/karaf
Empujo esa imagen con
docker push outserver.at:5000/karaf
Extraigo la imagen en algún sistema de destino a través de
docker pull outserver.at:5000/karaf
Comienzo mi archivo docker-compose que tiene estas imágenes como servicios a través de
docker-compose up
Esperaría que el comando push sobrescriba la imagen existente en el registro con la imagen más nueva. Lógicamente, si extraigo esa imagen en el sistema de destino, espero que la imagen se actualice. Pero en realidad, la imagen que obtengo está desactualizada.
La mejor práctica generalmente es ser explícito en la docker run
y comandos similares: use una etiqueta única para cada compilación de imagen (como un sello de fecha, ID de compromiso de control de fuente o número de compilación), use esa versión específica/número de compilación cuando esté implementando, y no confíe en cosas como la etiqueta latest
.
El truco aquí es que si docker run someimage:latest
, Docker primero comienza mirando su lista local de imágenes. Si ya tiene algo con ese nombre y etiqueta exactos, simplemente lo ejecuta; si no, implícitamente docker pull
primero. Esto también se extiende a los sistemas de orquestación de nivel superior (tiene que esforzarse bastante para que Kubernetes lo obligue a recargar una imagen, por ejemplo).
En el caso de Docker Compose, docker-compose up
intenta llevar el sistema a un estado esperado, realizando el mínimo trabajo necesario. Si cambia la etiqueta en el contenedor de su aplicación, docker-compose up
eliminará y volverá a crear ese contenedor sin tocar el contenedor de su base de datos. Además de la extracción manual de la docker pull
que está haciendo, es posible que deba docker-compose stop app; docker-compose rm app
para forzar la reconstrucción de un contenedor.
Si su comando push realmente funcionó y envió con éxito una nueva imagen a su registro, entonces, extraer la imagen como lo está haciendo funcionará y terminará con la imagen más nueva.
Verifique (mirando el código de retorno) que el impulso funcionó correctamente (a continuación se muestra Bash):
> docker push outserver.at:5000/karaf > echo $?
Si no ve esto, muéstrenos los mensajes de la consola para los pasos de compilación, etiquetado, inserción y extracción.
IMPORTANTE:
Tenga en cuenta que la etiqueta :latest
no tiene nada que ver con la última imagen en el registro. Una etiqueta es simplemente una cadena que está asociada con una imagen: en este caso, la cadena está formada por las letras l
, a
, t
, e
, s
y t
, no significa necesariamente que la etiqueta sea la imagen más reciente. La etiqueta :latest
se sobrescribe en 2 circunstancias:
docker push outserver.at:5000/karaf:latest
.docker push outserver.at:5000/karaf
. Si inserta una imagen sin etiqueta (sobrescribiendo así la latest
etiqueta en el registro), y luego inserta una imagen más nueva pero especificando una etiqueta, entonces la :latest
etiqueta no se sobrescribirá y apuntará a la primera imagen, no a la más nueva. uno.
La mejor práctica es especificar siempre una etiqueta de imagen: nunca use la etiqueta :latest
.