Estoy ejecutando una aplicación de reacción en un contenedor docker, en un servidor Coreos. Digamos que se extrajo de dockerhub de https://hub.docker.com/r/myimages/myapp .
Ahora quiero verificar periódicamente si la imagen de dockerhub para el contenedor de la aplicación se ha actualizado, para ver si la imagen que estoy ejecutando localmente está atrasada.
¿Cuál sería la forma más eficiente de verificar si una imagen acoplable local está desactualizada en comparación con la imagen remota? Todas las soluciones que he encontrado hasta ahora son scripts bash o servicios externos que impulsan una actualización. Me gustaría encontrar una solución que sea lo más nativa posible de la ventana acoplable y me gustaría abstenerme de enviar una notificación desde otro lugar (para alertar al servidor de una imagen actualizada).
Puede consultar la API de registro para el resumen de la imagen y compararlo con lo que extrajo.
$ cat digest-v2.sh #!/bin/sh ref="${1:-library/ubuntu:latest}" repo="${ref%:*}" tag="${ref##*:}" acceptM="application/vnd.docker.distribution.manifest.v2+json" acceptML="application/vnd.docker.distribution.manifest.list.v2+json" token=$(curl -s "https://auth.docker.io/token?service=registry.docker.io&scope=repository:${repo}:pull" \ | jq -r '.token') curl -H "Accept: ${acceptM}" \ -H "Accept: ${acceptML}" \ -H "Authorization: Bearer $token" \ -I -s "https://registry-1.docker.io/v2/${repo}/manifests/${tag}" $ ./digest-v2.sh library/busybox:latest HTTP/1.1 200 OK Content-Length: 2080 Content-Type: application/vnd.docker.distribution.manifest.list.v2+json Docker-Content-Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a Docker-Distribution-Api-Version: registry/2.0 Etag: "sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a" Date: Sun, 11 Oct 2020 21:04:59 GMT Strict-Transport-Security: max-age=31536000Puede comparar ese encabezado ETag o Docker-Content-Digest con la referencia de registro en la imagen que extrajo anteriormente:
$ docker image inspect busybox:latest --format '{{json .RepoDigests}}' | jq . [ "busybox@sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a" ] $ docker image pull busybox:latest latest: Pulling from library/busybox Digest: sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05a Status: Image is up to date for busybox:latest docker.io/library/busybox:latest También he estado trabajando en algunas API y CLI de Go para trabajar con más registros en los que es posible que deba aprobar diferentes tipos de autorización. Ese proyecto está en regclient/regclient e incluye un comando regctl .
$ regctl image digest --list busybox:latest sha256:d366a4665ab44f0648d7a00ae3fae139d55e32f9712c67accd604bb55df9d05aSi está utilizando Docker Hub, puede usar un Webhook para notificar al host de Docker sobre una actualización y tomar medidas al respecto.
Usar el webhook sería la forma "simple" de hacerlo (creo), de lo contrario, tendría que hacer algún tipo de rastreo en la extracción de la ventana acoplable o como lo explica @alebianco comparando algunos hash o fechas de compilación/creación.
Aquí están los documentos al respecto: https://docs.docker.com/docker-hub/webhooks/
hay una API disponible para Docker Hub
Debería poder obtener la lista de etiquetas y, a partir de ahí, los detalles del manifiesto.
editar
Investigué un poco, parece que no exponen ningún tipo de suma de verificación de la imagen, es manifiesto o las capas que la componen.
Lo más parecido que encontré es la fecha de creación... que no sugeriría usar si estás tratando de hacer algo remotamente seguro.
De todos modos, primero debe obtener un token de acceso
curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull"extraiga el token de la respuesta, luego puede cargar el manifiesto de una versión de imagen
curl --header "Authorization: Bearer $TOKEN" https://index.docker.io/v2/library/ubuntu/manifests/latestbusque en el objeto de historial del json devuelto, encontrará una propiedad creada .
Luego puede obtener la fecha de creación de su imagen local con
docker inspect --format "{{json .Created}}" ubuntu:latestCompara los dos y encogerse de distancia ...