Disons que j'ai un conteneur trivial basé sur le ubuntu:latest
. Il y a maintenant une mise à jour de sécurité et ubuntu:latest
est mise à jour dans le dépôt Docker.
Comment pourrais-je savoir que mon image locale et ses conteneurs sont en retard?
Existe-t-il une meilleure pratique pour la mise à jour automatique des images et des conteneurs locaux pour suivre les mises à jour du référentiel docker, ce qui, dans la pratique, vous donnerait les mêmes avantages d'avoir des mises à niveau sans assistance exécutées sur une machine ubuntu conventionnelle
docker
automatic-updates
hbogert
la source
la source
Réponses:
Une des façons de le faire est de le piloter via vos systèmes CI / CD. Une fois que votre image parent est construite, ayez quelque chose qui scanne votre dépôt git pour les images utilisant ce parent. S'il était trouvé, vous enverriez alors une demande d'extraction pour passer à de nouvelles versions de l'image. La demande d'extraction, si tous les tests réussissent, serait fusionnée et vous auriez une nouvelle image enfant basée sur le parent mis à jour. Un exemple d'un outil qui adopte cette approche peut être trouvé ici: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Si vous ne contrôlez pas votre image parent, comme ce serait le cas si vous dépendez de l'
ubuntu
image officielle , vous pouvez écrire des outils qui détectent les changements dans la balise ou la somme de contrôle de l'image parent (ce n'est pas la même chose, les balises sont mutables) et invoquer les builds d'image enfants en conséquence.la source
Nous utilisons un script qui vérifie si un conteneur en cours d'exécution est démarré avec la dernière image. Nous utilisons également des scripts d'init pour le démarrage de l'image docker.
Et init ressemble
la source
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
obtiendra les informations du conteneur. Ajoutez--type image
pour résoudre ce problème.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
Une `` méthode de docker '' consisterait à utiliser les versions automatisées de Docker Hub . La fonctionnalité Liens de référentiel reconstruira votre conteneur lorsqu'un conteneur en amont est reconstruit, et la fonctionnalité Webhooks vous enverra une notification.
Il semble que les webhooks soient limités aux appels HTTP POST. Vous devez configurer un service pour les attraper, ou peut-être utiliser l'un des POST pour envoyer des services par courrier électronique.
Je ne l'ai pas examiné, mais le nouveau plan de contrôle universel Docker pourrait avoir une fonctionnalité pour détecter les conteneurs mis à jour et redéployer.
la source
Vous pouvez utiliser Watchtower pour surveiller les mises à jour de l'image à partir de laquelle un conteneur est instancié et extraire automatiquement la mise à jour et redémarrer le conteneur à l'aide de l'image mise à jour. Cependant, cela ne résout pas le problème de la reconstruction de vos propres images personnalisées en cas de modification de l'image en amont sur laquelle elle est basée. Vous pouvez voir cela comme un problème en deux parties: (1) savoir quand une image en amont a été mise à jour et (2) faire la reconstruction réelle de l'image. (1) peut être résolu assez facilement, mais (2) dépend beaucoup de votre environnement / pratiques de construction local, il est donc probablement beaucoup plus difficile de créer une solution généralisée pour cela.
Si vous pouvez utiliser les versions automatisées de Docker Hub , tout le problème peut être résolu de manière relativement propre à l'aide de la fonctionnalité de liens de référentiel , qui vous permet de déclencher une reconstruction automatiquement lorsqu'un référentiel lié (probablement un en amont) est mis à jour. Vous pouvez également configurer un webhook pour vous avertir lorsqu'une génération automatisée se produit. Si vous souhaitez recevoir une notification par e-mail ou SMS, vous pouvez connecter le webhook à IFTTT Maker . J'ai trouvé que l'interface utilisateur IFTTT était un peu déroutante, mais vous configureriez le webhook Docker pour qu'il s'affiche sur https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ avec / key /your_key
.Si vous devez créer localement, vous pouvez au moins résoudre le problème d'obtention de notifications lorsqu'une image en amont est mise à jour en créant un référentiel factice dans Docker Hub lié à votre ou vos référentiels d'intérêt. Le seul objectif du dépôt factice serait de déclencher un webhook lors de sa reconstruction (ce qui implique que l'un de ses dépôts liés a été mis à jour). Si vous pouvez recevoir ce webhook, vous pouvez même l'utiliser pour déclencher une reconstruction de votre côté.
la source
REPO_USER
etREPO_PASS
. Jetez un œil à readme.md de Watchtower pour plus d'informations: github.com/v2tec/watchtower#usageJ'ai eu le même problème et j'ai pensé qu'il peut être simplement résolu par un travail cron appelant
unattended-upgrade
quotidiennement.Mon intention est d'avoir cela comme une solution automatique et rapide pour garantir que le conteneur de production est sécurisé et mis à jour car cela peut me prendre un certain temps pour mettre à jour mes images et déployer une nouvelle image docker avec les dernières mises à jour de sécurité.
Il est également possible d'automatiser la création et le déploiement d'images avec des hooks Github
J'ai créé une image de docker de base avec laquelle vérifie et installe automatiquement les mises à jour de sécurité quotidiennement (peut être exécutée directement par
docker run itech/docker-unattended-upgrade
).Je suis également tombé sur une autre approche différente pour vérifier si le conteneur a besoin d'une mise à jour.
Ma mise en œuvre complète:
Dockerfile
Scripts d'assistance
installer
début
Éditer
J'ai développé un petit outil docker-run qui fonctionne comme conteneur docker et peut être utilisé pour mettre à jour des packages à l'intérieur de tous les conteneurs en cours ou sélectionnés, il peut également être utilisé pour exécuter des commandes arbitraires.
Peut être facilement testé avec la commande suivante:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
qui par défaut exécutera la
date
commande dans tous les conteneurs en cours d'exécution et affichera les résultats. Si vous passez à laupdate
place,exec
il s'exécuteraapt-get update
suivi deapt-get upgrade -y
tous les conteneurs en cours d'exécutionla source
Kubernetes
qui est utile pour le déploiement d'une grande infrastructure, mais il est toujours en cours de développement intensif par Google. Pour le moment, vous pouvez automatiser cela avec un outil d'approvisionnement comme Ansible d'une manière assez simple.Vous ne sauriez pas que votre conteneur est derrière sans exécuter la traction de docker . Ensuite, vous devrez reconstruire ou recomposer votre image.
Les commandes peuvent être placées dans un script avec tout autre élément nécessaire pour terminer la mise à niveau, bien qu'un conteneur approprié n'ait besoin de rien de plus.
la source
La gestion des dépendances pour les images Docker est un vrai problème. Je fais partie d'une équipe qui a construit un outil, MicroBadger , pour aider à cela en surveillant les images des conteneurs et en inspectant les métadonnées. L'une de ses fonctionnalités est de vous permettre de configurer un webhook de notification qui est appelé lorsqu'une image qui vous intéresse (par exemple une image de base) change.
la source
Il y a beaucoup de réponses ici, mais aucune ne correspond à mes besoins. Je voulais une réponse réelle à la question n ° 1 du demandeur. Comment savoir quand une image est mise à jour sur hub.docker.com?
Le script ci-dessous peut être exécuté quotidiennement. Lors de la première exécution, il obtient une base de référence des balises et des dates de mise à jour à partir du registre HUB et les enregistre localement. À partir de là, chaque fois qu'il est exécuté, il recherche dans le registre de nouvelles balises et des dates de mise à jour. Étant donné que cela change chaque fois qu'une nouvelle image existe, cela nous indique si l'image de base a changé. Voici le script:
Vous souhaiterez modifier la
DATAPATH
variable en haut et modifier la commande de notification par e-mail à la fin pour répondre à vos besoins. Pour moi, je l'ai SSH dans un serveur sur un autre réseau où se trouve mon SMTP. Mais vous pouvez aussi facilement utiliser lamail
commande.Maintenant, vous voulez également vérifier les packages mis à jour à l'intérieur des conteneurs eux-mêmes. C'est en fait probablement plus efficace que de faire un "pull" une fois que vos conteneurs fonctionnent. Voici le script pour le retirer:
la source
Une autre approche pourrait être de supposer que votre image de base prend du retard assez rapidement (et cela est très susceptible de se produire), et de forcer une autre génération d'image de votre application périodiquement (par exemple chaque semaine), puis de la redéployer si elle a changé.
Pour autant que je sache, les images de base populaires comme Debian ou Java mettent à jour leurs balises pour prendre en compte les correctifs de sécurité, de sorte que les balises ne sont pas immuables (si vous voulez une meilleure garantie de cela, vous devez utiliser la référence [image: @digest ], disponible dans les versions Docker les plus récentes). Par conséquent, si vous deviez construire votre image avec
docker build --pull
, votre application devrait obtenir la dernière et la plus grande balise d'image de base à laquelle vous faites référence.Étant donné que les balises mutables peuvent prêter à confusion, il est préférable d'incrémenter le numéro de version de votre application chaque fois que vous faites cela afin qu'au moins de votre côté les choses soient plus propres.
Je ne suis donc pas sûr que le script suggéré dans l'une des réponses précédentes fasse l'affaire, car il ne reconstruit pas l'image de votre application - il met simplement à jour la balise d'image de base, puis redémarre le conteneur, mais le nouveau conteneur fait toujours référence l'ancien hachage de l'image de base.
Je ne recommanderais pas d'exécuter des travaux de type cron dans des conteneurs (ou tout autre processus, sauf si cela est vraiment nécessaire) car cela va à l'encontre du mantra de l'exécution d'un seul processus par conteneur (il existe divers arguments pour expliquer pourquoi c'est mieux, donc je '' je ne vais pas y entrer ici).
la source
Je ne vais pas entrer dans toute la question de savoir si vous voulez ou non des mises à jour sans surveillance en production (je pense que non). Je laisse juste ceci ici pour référence au cas où quelqu'un le trouverait utile. Mettez à jour toutes vos images de docker vers la dernière version avec la commande suivante dans votre terminal:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
la source
# docker system prune -a --volumes -f
pour nettoyer les anciennes images (pendantes), les volumes, etc.MISE À JOUR: utilisez Dependabot - https://dependabot.com/docker/
BLUF: trouver le bon point d'insertion pour surveiller les modifications apportées à un conteneur est le défi. Ce serait formidable si DockerHub pouvait résoudre ce problème. (Les liens de référentiel ont été mentionnés mais notez lors de leur configuration sur DockerHub - "Déclenchez une génération dans ce référentiel chaque fois que l'image de base est mise à jour sur Docker Hub. Ne fonctionne que pour les images non officielles." )
En essayant de résoudre ce problème moi-même, j'ai vu plusieurs recommandations pour les webhooks, je voulais donc élaborer sur quelques solutions que j'ai utilisées.
Utilisez microbadger.com pour suivre les changements dans un conteneur et utilisez sa fonction de webhook de notification pour déclencher une action. J'ai configuré cela avec zapier.com (mais vous pouvez utiliser n'importe quel service de webhook personnalisable) pour créer un nouveau problème dans mon référentiel github qui utilise Alpine comme image de base.
Suivez le flux RSS pour que git s'engage dans un conteneur en amont. ex. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . J'ai utilisé zapier.com pour surveiller ce flux et pour déclencher une construction automatique de mon conteneur dans Travis-CI chaque fois que quelque chose est commis. C'est un peu extrême mais vous pouvez changer le déclencheur pour faire d'autres choses comme ouvrir un problème dans votre référentiel git pour une intervention manuelle.
la source
Prémisse à ma réponse:
Approche
De plus, l'image de base peut être mise à niveau / le conteneur avec une nouvelle image de base complète peut être construit à intervalles réguliers, si le responsable le juge nécessaire
Les avantages
la source
Les réponses ci-dessus sont également correctes
Il existe deux approches
Je ne fais que partager le script, cela peut vous être utile! Vous pouvez l'utiliser avec cronjob, j'ai essayé avec succès sur OSX
Voici mon fichier docker-compose
la source
Mettez le travail via
$ crontab -e
:Créer dir
~/.docker
avec fichiercron.sh
:la source
avez-vous essayé ceci: https://github.com/v2tec/watchtower . c'est un outil simple fonctionnant dans un conteneur docker en regardant d'autres conteneurs, si leur image de base a changé, il sera tiré et redéployé.
la source
Une solution simple et excellente est berger
la source