tag run library images hub dockers compose docker docker-swarm

run - dockers images



Docker Swarm Service: fuerza la actualización de la última imagen que ya está en ejecución (4)

Docker no realizará automáticamente una extracción desde DockerHub (o registro privado) para una imagen: etiqueta que ya tiene localmente.

Si realizó una extracción manual antes de la docker service update la docker service update , o si eliminó la imagen localmente, lo haría.

También puedes encadenar el comando:

docker pull image:tag && docker service update --image username/imagename:latest servicename

Puede evitar este escenario etiquetando sus imágenes numéricamente y usando una etiqueta actualizada. username/imagename:1.1.0

ambiente

  • ventana acoplable 1.12
  • clusted en Ubuntu 16.04

¿Hay alguna forma de forzar una actualización progresiva a un servicio de enjambre de ventana acoplable que ya se está ejecutando si la actualización del servicio no cambia ningún parámetro pero la imagen del concentrador de la ventana acoplable se ha actualizado?

Ejemplo: Desplegué servicio:

docker service create --replicas 1 --name servicename --publish 80:80 username/imagename:latest

Mi proceso de compilación actualizó la última imagen en el concentrador de docker. Ahora quiero extraer la última vez.

He intentado correr:

docker service update --image username/imagename:latest servicename

Cuando sigo este proceso, la ventana acoplable no extrae lo último, supongo que asume que ya que quería la última y la ventana acoplable ya sacó una imagen: la última no tiene nada que hacer.

El único trabajo que tengo alrededor es eliminar el nombre de servicio del servicio y volver a implementarlo.


Lo que hago es

  1. tira la imagen primero
  2. Ejecuta el comando de actualización con la nueva etiqueta de marca de tiempo

actualización del servicio docker --container-label-add last_deployed = $ (fecha -u +% Y-% m-% dT% H:% M:% S) service_name_or_id


Puede usar la ID de imagen en lugar del username/imagename:latest de username/imagename:latest esta manera:

docker service update --image / $(docker inspect --type image --format ''{{.Id}}'' username/imagename:latest) / servicename

Pero en este caso, todos los nodos deben extraer esta imagen antes de la actualización del servicio . De lo contrario, los contenedores se actualizarán solo en aquellos nodos donde exista una imagen con tal ID. Afortunadamente, los nodos que no tienen esta imagen detendrán sus contenedores, por lo que no hay nada de malo si algunos nodos no pueden obtener una nueva versión de la imagen.

ACTUALIZACIÓN : o podría utilizar el resumen de la imagen de la siguiente manera:

docker service update --image / $(docker inspect --type image --format ''{{index .RepoDigests 0}}'' username/imagename:latest) / servicename

docker inspect --type image --format ''{{index .RepoDigests 0}}'' IMAGE devuelve el resumen de la imagen que incluye el hash único de la imagen generada por el registro v2. Por lo tanto, la imagen debe sacarse del registro, de lo contrario no estará disponible el resumen.

El uso de compendio le permite no extraer imágenes de todos sus nodos (las imágenes con un compendio específico se extraerán automáticamente del registro en los nodos necesarios). Pero debe extraer una versión nueva de la imagen una vez en un nodo administrador antes de la actualización del servicio.

Por cierto, la última forma será por defecto desde Docker 1.13


Solo para referencia futura:

Docker 1.13 agregó una --force para service update :

--force : Forzar actualización incluso si ningún cambio lo requiere

Úsalo como en:

docker service update --force service_name