Digamos que tengo un contenedor trivial basado en el ubuntu:latest
. Ahora hay una actualización de seguridad y ubuntu:latest
se actualiza en el repositorio de Docker.
¿Cómo sabría si mi imagen local y sus contenedores se están quedando atrás?
¿Existe alguna práctica recomendada para actualizar automáticamente las imágenes y los contenedores locales para seguir las actualizaciones del repositorio de Docker, que en la práctica le brindarían las mismas ventajas de tener actualizaciones desatendidas ejecutándose en una máquina ubuntu convencional?
docker
automatic-updates
hbogert
fuente
fuente
Respuestas:
Una de las formas de hacerlo es conducir esto a través de sus sistemas CI / CD. Una vez que se construye su imagen principal, tenga algo que escanee sus repositorios de git en busca de imágenes usando ese padre. Si se encuentra, enviaría una solicitud de extracción para pasar a nuevas versiones de la imagen. La solicitud de extracción, si se superan todas las pruebas, se fusionaría y tendría una nueva imagen secundaria basada en el elemento primario actualizado. Un ejemplo de una herramienta que adopta este enfoque se puede encontrar aquí: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Si no controla su imagen principal, como sería el caso si depende de la
ubuntu
imagen oficial , puede escribir algunas herramientas que detecten cambios en la etiqueta o suma de verificación de la imagen principal (no es lo mismo, las etiquetas son mutables) y invocar compilaciones de imágenes secundarias en consecuencia.fuente
Usamos un script que verifica si un contenedor en ejecución se inicia con la última imagen. También utilizamos secuencias de comandos de inicio para iniciar la imagen del acoplador.
Y init parece
fuente
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
obtendrá la información del contenedor. Añadir--type image
para arreglar esto.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
Una 'forma de docker' sería utilizar las compilaciones automatizadas de docker hub . La función Enlaces de repositorio reconstruirá su contenedor cuando se reconstruya un contenedor ascendente, y la función Webhooks le enviará una notificación.
Parece que los webhooks están limitados a llamadas HTTP POST. Tendría que configurar un servicio para atraparlos, o tal vez usar uno de los servicios POST para enviar por correo electrónico.
No lo he investigado, pero el nuevo Docker Universal Control Plane podría tener una función para detectar contenedores actualizados y volver a implementarlos.
fuente
Puede usar Watchtower para ver las actualizaciones de la imagen de la que se crea una instancia de un contenedor y extraer automáticamente la actualización y reiniciar el contenedor utilizando la imagen actualizada. Sin embargo, eso no resuelve el problema de reconstruir sus propias imágenes personalizadas cuando hay un cambio en la imagen ascendente en la que se basa. Podría ver esto como un problema de dos partes: (1) saber cuándo se ha actualizado una imagen ascendente y (2) hacer la reconstrucción de la imagen real. (1) se puede resolver con bastante facilidad, pero (2) depende mucho de su entorno de construcción local / prácticas, por lo que probablemente sea mucho más difícil crear una solución generalizada para eso.
Si puede usar las compilaciones automatizadas de Docker Hub , todo el problema se puede resolver de manera relativamente limpia utilizando la función de enlaces del repositorio , que le permite activar una reconstrucción automáticamente cuando se actualiza un repositorio vinculado (probablemente uno ascendente). También puede configurar un webhook para que le notifique cuando se produce una compilación automática. Si desea una notificación por correo electrónico o SMS, puede conectar el webhook a IFTTT Maker . Encontré que la interfaz de usuario de IFTTT es un poco confusa, pero configuraría el webhook de Docker para publicar en https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ with / key /your_key
.Si necesita construir localmente, al menos puede resolver el problema de recibir notificaciones cuando se actualiza una imagen ascendente creando un repositorio ficticio en Docker Hub vinculado a su (s) repositorio (s) de interés. El único propósito del repositorio ficticio sería activar un webhook cuando se reconstruya (lo que implica que se actualizó uno de sus repositorios vinculados). Si puede recibir este webhook, incluso podría usarlo para activar una reconstrucción de su lado.
fuente
REPO_USER
yREPO_PASS
variables de entorno. Eche un vistazo a readme.md de Watchtower para obtener más información: github.com/v2tec/watchtower#usageTuve el mismo problema y pensé que puede resolverse simplemente con un trabajo cron que llama
unattended-upgrade
diariamente.Mi intención es tener esto como una solución automática y rápida para garantizar que el contenedor de producción sea seguro y actualizado porque me puede llevar algún tiempo actualizar mis imágenes e implementar una nueva imagen acoplable con las últimas actualizaciones de seguridad.
También es posible automatizar la creación e implementación de imágenes con ganchos Github
He creado una imagen básica de docker con la que comprueba e instala automáticamente actualizaciones de seguridad a diario (puede ejecutarse directamente
docker run itech/docker-unattended-upgrade
).También me encontré con otro enfoque diferente para verificar si el contenedor necesita una actualización.
Mi implementación completa:
Dockerfile
Guiones de ayuda
Instalar en pc
comienzo
Editar
Desarrollé una pequeña herramienta docker-run que se ejecuta como contenedor de docker y se puede usar para actualizar paquetes dentro de todos o contenedores de ejecución seleccionados, también se puede usar para ejecutar comandos arbitrarios.
Se puede probar fácilmente con el siguiente comando:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
que por defecto se ejecutará
date
comandos en todos los contenedores que se ejecutan y mostrar los resultados. Si pasa en suupdate
lugarexec
, se ejecutaráapt-get update
seguido deapt-get upgrade -y
todos los contenedores en ejecuciónfuente
Kubernetes
que es útil para la implementación de grandes infraestructuras, pero Google todavía lo está desarrollando intensamente. Por el momento, puede automatizar esto con una herramienta de aprovisionamiento como Ansible de una manera bastante simple.No sabría que su contenedor está detrás sin ejecutar la extracción de la ventana acoplable . Entonces necesitarías reconstruir o recomponer tu imagen.
Los comandos se pueden colocar en un script junto con cualquier otra cosa necesaria para completar la actualización, aunque un contenedor adecuado no necesitaría nada adicional.
fuente
La gestión de dependencias para las imágenes de Docker es un problema real. Soy parte de un equipo que creó una herramienta, MicroBadger , para ayudar con esto al monitorear las imágenes del contenedor e inspeccionar los metadatos. Una de sus características es permitirle configurar un webhook de notificación que se llama cuando cambia una imagen que le interesa (por ejemplo, una imagen base).
fuente
Aquí hay muchas respuestas, pero ninguna de ellas satisfizo mis necesidades. Quería una respuesta real a la pregunta número 1 del autor de la pregunta. ¿Cómo sé cuándo se actualiza una imagen en hub.docker.com?
El siguiente script se puede ejecutar a diario. En la primera ejecución, obtiene una línea base de las etiquetas y las fechas de actualización del registro HUB y las guarda localmente. A partir de ese momento, cada vez que se ejecuta, comprueba el registro en busca de nuevas etiquetas y fechas de actualización. Como esto cambia cada vez que existe una nueva imagen, nos dice si la imagen base ha cambiado. Aquí está el guión:
Deberá modificar la
DATAPATH
variable en la parte superior y modificar el comando de notificación por correo electrónico al final para satisfacer sus necesidades. Para mí, lo tengo SSH en un servidor en otra red donde se encuentra mi SMTP. Pero también podría usar elmail
comando fácilmente .Ahora, también desea verificar si hay paquetes actualizados dentro de los contenedores. En realidad, esto es probablemente más efectivo que hacer una "extracción" una vez que sus contenedores están funcionando. Aquí está el guión para lograrlo:
fuente
Otro enfoque podría ser asumir que su imagen base se queda atrás bastante rápido (y es muy probable que eso suceda), y forzar periódicamente la creación de otra imagen de su aplicación (por ejemplo, cada semana) y luego volver a implementarla si ha cambiado.
Por lo que puedo decir, las imágenes base populares como Debian o Java oficiales actualizan sus etiquetas para satisfacer las correcciones de seguridad, por lo que las etiquetas no son inmutables (si desea una garantía más sólida de eso, debe usar la referencia [imagen: @digest ], disponible en versiones más recientes de Docker). Por lo tanto, si tuviera que construir su imagen con
docker build --pull
, entonces su aplicación debería obtener la última y mejor etiqueta de imagen base a la que hace referencia.Dado que las etiquetas mutables pueden ser confusas, es mejor incrementar el número de versión de su aplicación cada vez que lo hace para que al menos las cosas estén más limpias.
Por lo tanto, no estoy seguro de que el script sugerido en una de las respuestas anteriores haga el trabajo, ya que no reconstruye la imagen de su aplicación, solo actualiza la etiqueta de la imagen base y luego reinicia el contenedor, pero el nuevo contenedor aún hace referencia el viejo hash de imagen base.
No recomendaría ejecutar trabajos de tipo cron en contenedores (o cualquier otro proceso, a menos que sea realmente necesario), ya que esto va en contra del mantra de ejecutar solo un proceso por contenedor (hay varios argumentos sobre por qué esto es mejor, así que ' No voy a entrar aquí).
fuente
No voy a entrar en la cuestión de si desea o no actualizaciones desatendidas en producción (creo que no). Solo dejo esto aquí como referencia en caso de que alguien lo encuentre útil. Actualice todas sus imágenes de Docker a la última versión con el siguiente comando en su terminal:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
fuente
# docker system prune -a --volumes -f
para limpiar imágenes antiguas (colgantes), volúmenes, etc.ACTUALIZACIÓN: Use Dependabot - https://dependabot.com/docker/
BLUF: encontrar el punto de inserción correcto para monitorear los cambios en un contenedor es el desafío. Sería genial si DockerHub resolviera esto. (Se han mencionado enlaces de repositorio, pero tenga en cuenta al configurarlos en DockerHub: " Dispare una compilación en este repositorio siempre que la imagen base se actualice en Docker Hub. Solo funciona para imágenes no oficiales" ).
Mientras intentaba resolver esto por mí mismo, vi varias recomendaciones para webhooks, así que quise elaborar un par de soluciones que he usado.
Use microbadger.com para rastrear los cambios en un contenedor y use su función de notificación de webhook para activar una acción. Configuré esto con zapier.com (pero puedes usar cualquier servicio de webhook personalizable) para crear un nuevo problema en mi repositorio de github que usa Alpine como imagen base.
Rastree la fuente RSS para git commits a un contenedor ascendente. ex. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Utilicé zapier.com para monitorear este feed y activar una compilación automática de mi contenedor en Travis-CI cada vez que algo se confirma. Esto es un poco extremo, pero puede cambiar el gatillo para hacer otras cosas como abrir un problema en su repositorio de git para la intervención manual.
fuente
Premisa a mi respuesta:
Acercarse
Además, la imagen base se puede actualizar / el contenedor con una nueva imagen base completa se puede construir a intervalos regulares, según el mantenedor lo considere necesario
Ventajas
fuente
Las respuestas anteriores también son correctas
Hay dos enfoques
Solo estoy compartiendo script, ¡puede ser útil para usted! Puedes usarlo con cronjob, lo intenté con éxito en OSX
Aquí está mi archivo docker-compose
fuente
Pon el trabajo a través de
$ crontab -e
:Crear directorio
~/.docker
con archivocron.sh
:fuente
¿Has probado esto? https://github.com/v2tec/watchtower . es una herramienta simple que se ejecuta en el contenedor acoplable mirando otros contenedores, si su imagen base cambia, se extraerá y volverá a desplegar.
fuente
Una solución simple y excelente es Shepherd
fuente