2.3 · Versionar y publicar tus imágenes

Nivel 2 · Dockerfile y build

2.3Versionar y publicar tus imágenes

Objetivo: Etiquetar correctamente tus imágenes y publicarlas en un registro para compartirlas.
Tiempo estimado: 11 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • Etiquetar en el build, cuenta incluida : cuenta/imagen:versión es la dirección completa — sin namespace, no hay push.
  • Inmutable por entrega : una etiqueta fijada y probada por versión (1.2.0), nunca reescrita — los alias móviles solo sirven para comodidad.
  • Nunca subir un secreto : todo lo que entra en la imagen se va con el push — un push público es irreversible.

Mini-caso hilado — Idir y la prod que tiraba de latest

La imagen ligera de Idir (2.2) funciona en local, pero el equipo la comparte a mano, en latest, sin versión : la prod ya ha derivado dos veces. Idir etiqueta en el build con la cuenta (micuenta/mi-app:1.2.0 más alias 1.2), se conecta al registro, sube las dos etiquetas, y luego hace tirar de la 1.2.0 en otra máquina : build aquí, run allí, versión fijada. Verifica la visibilidad del repositorio antes de subir. En 2.4, hará configurable esta imagen ; en 2.5, verificará que no contenga ningún secreto antes de cada nuevo push.

Continuación del hilo conductor 2.2 : la imagen ligera de Idir viaja con un número de versión — y continúa en 2.4 y 2.5.

1. Etiquetar como un profesional

Se etiqueta en el build (-t micuenta/mi-app:1.2.0) y se añaden alias útiles (1.2, latest en dev). Regla : una etiqueta inmutable por entrega (1.2.0), nunca reescrita ; los alias móviles solo sirven para comodidad. La prod siempre tira de la etiqueta fijada y probada, nunca de latest. Idir fija la 1.2.0 y deja que la 1.2 siga los correctivos.

2. Publicar : login, push, pull

docker login autentica, docker push micuenta/mi-app:1.2.0 publica, cualquier máquina la recupera por pull. El nombre cuenta/imagen:tag es la dirección completa : sin cuenta (namespace), el push es rechazado. Idir sube sus dos etiquetas y luego, en otra máquina (o tras un rmi local), tira de la 1.2.0 y la lanza : la prueba de que la imagen viaja.

3. ¿Público o privado ?

Por defecto en el Hub, un repositorio es público : perfecto para open source, prohibido para código interno. Para lo interno, repositorio privado (Hub de pago, GHCR, registro de empresa). Y nunca un secreto en la imagen : un secreto COPY o ENV queda en las capas y se va con el push — un push público es irreversible. Idir controla la visibilidad antes de cada push y mantiene los secretos fuera de la imagen (2.5).

Error frecuente de interpretación: « Todo en latest, es más simple ». No : latest se mueve con cada push, la prod deriva sin avisar y ya no se sabe qué funciona. La regla de Idir : una etiqueta inmutable (1.2.0) por entrega para la prod, alias móviles (1.2, latest) para la comodidad en dev — nunca al revés.
De la imagen local al registro Etiquetar en el build, autenticar, subir build -t cuenta/app:1.2 Etiquetar enel build, cuenta incluidadocker login Autenticarseen el registrodocker push Publicar, y luegopull en otro lugar
Etiquetar en el build, autenticar, subir
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Idir ETIQUETA : en el build, con el namespace (micuenta/mi-app:1.2.0) más un alias de comodidad (1.2) — la 1.2.0 está fijada, nunca reescrita. 2) SUBE : docker login y luego docker push de las dos etiquetas, visibilidad del repositorio verificada (público para open source, privado para lo interno). 3) TIRA : en otra máquina, docker pull de la 1.2.0 y luego run — build aquí, run allí. Lección : la prod tira de una etiqueta fijada y probada, nunca de latest.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Publicar la 1.2.0

La imagen de Idir, de la máquina local al registro :

docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
# sur une autre machine :
docker pull moncompte/mon-app:1.2.0

Lectura : la 1.2.0 está fijada y probada, la 1.2 sigue los correctivos, latest queda como comodidad de dev.

Lección : la prod tira de la 1.2.0, nunca de latest — reproducible y trazable.

Vocabulario de la sección

Namespace
La cuenta o la organización delante de la imagen (micuenta/mi-app) : la dirección completa exigida para subir.

Ejemplo sencillo: Idir antepone su cuenta desde el build.

Lo que no es: la etiqueta de versión sola.

Reflejo: sin namespace = sin push.

Tag inmutable
Una versión fijada y nunca reescrita (1.2.0) : lo que la prod tira para seguir siendo reproducible.

Ejemplo sencillo: Idir fija la 1.2.0 probada para la prod.

Lo que no es: un alias móvil como latest.

Reflejo: una entrega = una etiqueta fijada.

Alias
Una etiqueta móvil de comodidad (1.2, latest) que sigue los correctivos ; práctica en dev, prohibida como referencia de prod.

Ejemplo sencillo: Idir deja que 1.2 siga los parches, latest para las pruebas.

Lo que no es: la referencia desplegada en producción.

Reflejo: comodidad en dev, nunca en prod.

push / pull
Publicar hacia el registro (push) y recuperar desde el registro (pull) : el trío del intercambio con login.

Ejemplo sencillo: Idir sube la 1.2.0 y tira de ella en otra máquina.

Lo que no es: un build local nunca compartido.

Reflejo: login, push, pull : compartir versionado.

En la práctica — En la práctica — Publicar tu app

  1. Recompila tu app con dos etiquetas (1.0.0 fijada y 1.0 alias).
  2. Conéctate al registro (docker login).
  3. Sube las dos etiquetas (docker push), visibilidad verificada.
  4. En otra máquina (o tras rmi), tira de la 1.0.0 y lánzala.
Tus imágenes viajan : build aquí, run allí, versión fijada.

Script listo para decir — imponer la etiqueta fijada (30 s)

« Ya no desplegamos latest : cada entrega tiene su etiqueta fijada, probada, nunca reescrita — la 1.2.0 funciona en prod, sabemos exactamente qué. Los alias como 1.2 o latest quedan para la comodidad en dev. Build aquí, pull allí, misma versión en todas partes. »

Para decir mostrando el pull de la 1.2.0 de Idir en una segunda máquina.

Modelo copiar-pegar — etiquetar y publicar

docker build -t moncompte/mon-app:1.2.0 -t moncompte/mon-app:1.2 .
docker login
docker push moncompte/mon-app:1.2.0
docker push moncompte/mon-app:1.2
docker pull moncompte/mon-app:1.2.0

Push rechazado

Push « denied » : Idir verifica el login, el namespace cuenta/imagen y sus derechos sobre el repositorio.

Interno en público

Código interno subido a repositorio público : Idir pasa a privado (o registro de empresa) antes del push.

Etiqueta reescrita

Una 1.2.0 vuelta a subir distinta tras el despliegue : Idir fija 1.2.1 en lugar de reescribir la historia.

Push en cada commit

Cada prueba subida contamina el registro : Idir solo sube las versiones probadas, la CI filtrará (nivel 4).

✓ Buenas prácticas

  • Una etiqueta inmutable por entrega, nunca reescrita.
  • Anteponer la cuenta desde el build.
  • Verificar la visibilidad (público/privado) antes del push.

✗ Errores frecuentes

  • Reescribir una etiqueta ya desplegada (deriva de prod).
  • Subir en público código interno.
  • Incluir secretos en la imagen subida.

Puntos clave

  • Se etiqueta en el build, cuenta incluida (dirección completa).
  • Inmutable por entrega (1.2.0), alias (1.2, latest) para la comodidad.
  • login → push → pull : el trío del intercambio versionado.
  • Nunca un secreto en una imagen subida (push público irreversible).

Desafío 48h — aplica mañana

Publica tu imagen ligera (2.2) : build con dos etiquetas (1.0.0 + 1.0), login + push visibilidad verificada, y luego pull + run de la 1.0.0 en otro lugar.

Lista de salida de la sección
  • Puedo etiquetar en el build (inmutable + alias, cuenta incluida).
  • Sé publicar (login, push) y recuperar (pull) en otro lugar.
  • Controlo público/privado y excluyo los secretos antes de cada push.
Autoevaluación 1-5 : ¿mi prod tira de una etiqueta fijada ?¿verifico la visibilidad antes de cada push ?

Preguntas frecuentes

¿Por qué mi push es rechazado (denied) ?

A menudo un nombre sin namespace, o sin login, o sin derechos sobre el repositorio. Verifica docker login, el nombre cuenta/imagen:tag y tus derechos de escritura sobre el repositorio antes de reintentar.

¿Hay que subir en cada commit ?

No : se suben las versiones probadas (etiquetas fijadas), no cada prueba. La CI (nivel 4) automatizará este filtro : compila en cada commit pero solo publica las versiones validadas.

Comprueba tu comprensión

¿Qué política de etiquetas para la producción ?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 2Preguntas inéditas y más difíciles para validar tus conocimientos