Angenommen, ich habe einen trivialen Container, der auf dem basiert ubuntu:latest
. Jetzt gibt es ein Sicherheitsupdate, ubuntu:latest
das im Docker-Repo aktualisiert wird.
Woher weiß ich, dass mein lokales Image und seine Container hinterher laufen?
Gibt es eine bewährte Methode zum automatischen Aktualisieren lokaler Images und Container, um den Docker-Repo-Updates zu folgen, was Ihnen in der Praxis die gleichen Vorteile bietet, wenn unbeaufsichtigte Upgrades auf einem herkömmlichen Ubuntu-Computer ausgeführt werden
docker
automatic-updates
hbogert
quelle
quelle
Antworten:
Eine Möglichkeit, dies zu tun, besteht darin, dies über Ihre CI / CD-Systeme zu steuern. Sobald Ihr übergeordnetes Bild erstellt ist, können Sie Ihre Git-Repos mit diesem übergeordneten Bild nach Bildern durchsuchen. Wenn gefunden, senden Sie eine Pull-Anfrage, um auf neue Versionen des Bildes zuzugreifen. Wenn alle Tests erfolgreich sind, wird die Pull-Anforderung zusammengeführt und Sie erhalten ein neues untergeordnetes Image basierend auf dem aktualisierten übergeordneten Element. Ein Beispiel für ein Tool, das diesen Ansatz verwendet, finden Sie hier: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Wenn Sie Ihr übergeordnetes Bild nicht kontrollieren, wie dies der Fall wäre, wenn Sie vom offiziellen
ubuntu
Bild abhängig sind , können Sie ein Tool schreiben, das Änderungen am übergeordneten Bild-Tag oder der Prüfsumme erkennt (nicht dasselbe, Tags sind veränderbar) und Kinderbildaufrufe entsprechend aufrufen.quelle
Wir verwenden ein Skript, das prüft, ob ein laufender Container mit dem neuesten Image gestartet wird. Wir verwenden auch Upstart-Init-Skripte zum Starten des Docker-Images.
Und init sieht aus wie
quelle
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
werden die Containerinformationen abgerufen. Fügen Sie hinzu--type image
, um dies zu beheben.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
Ein "Docker-Weg" wäre die Verwendung automatisierter Docker-Hub- Builds . Die Funktion " Repository-Links" erstellt Ihren Container neu, wenn ein Upstream-Container neu erstellt wird, und die Funktion " Webhooks " sendet Ihnen eine Benachrichtigung.
Es sieht so aus, als wären die Webhooks auf HTTP-POST-Aufrufe beschränkt. Sie müssten einen Dienst einrichten, um sie abzufangen, oder einen der POSTs verwenden, um E-Mail-Dienste zu senden.
Ich habe mich nicht damit befasst, aber die neue Docker Universal Control Plane verfügt möglicherweise über eine Funktion zum Erkennen aktualisierter Container und zum erneuten Bereitstellen.
quelle
Sie können den Wachtturm verwenden , um nach Aktualisierungen des Images zu suchen, aus dem ein Container instanziiert wird, und das Update automatisch abzurufen und den Container mithilfe des aktualisierten Images neu zu starten. Dies löst jedoch nicht das Problem der Neuerstellung eigener benutzerdefinierter Images, wenn das zugrunde liegende Upstream-Image geändert wird. Sie können dies als zweiteiliges Problem betrachten: (1) Wissen, wann ein Upstream-Image aktualisiert wurde, und (2) Ausführen der eigentlichen Image-Neuerstellung. (1) kann ziemlich einfach gelöst werden, aber (2) hängt stark von Ihrer lokalen Build-Umgebung / -Praxis ab, sodass es wahrscheinlich viel schwieriger ist, eine allgemeine Lösung dafür zu erstellen.
Wenn Sie die automatisierten Builds von Docker Hub verwenden können, kann das gesamte Problem mithilfe der Repository-Verknüpfungsfunktion relativ sauber gelöst werden. Mit dieser Funktion können Sie automatisch eine Neuerstellung auslösen, wenn ein verknüpftes Repository (wahrscheinlich ein Upstream-Repository) aktualisiert wird. Sie können auch einen Webhook konfigurieren , um Sie zu benachrichtigen, wenn ein automatisierter Build erfolgt. Wenn Sie eine E-Mail- oder SMS-Benachrichtigung wünschen, können Sie den Webhook mit IFTTT Maker verbinden . Ich fand die IFTTT-Benutzeroberfläche etwas verwirrend, aber Sie würden den Docker-Webhook so konfigurieren, dass er unter https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ with / key / veröffentlicht wirdyour_key
.Wenn Sie lokal erstellen müssen, können Sie zumindest das Problem des Erhaltens von Benachrichtigungen beim Aktualisieren eines Upstream-Images lösen, indem Sie in Docker Hub ein Dummy-Repo erstellen, das mit Ihren Repos verknüpft ist. Der einzige Zweck des Dummy-Repos besteht darin, einen Webhook auszulösen, wenn er neu erstellt wird (was bedeutet, dass eines seiner verknüpften Repos aktualisiert wurde). Wenn Sie diesen Webhook erhalten können, können Sie damit sogar einen Neuaufbau auf Ihrer Seite auslösen.
quelle
REPO_USER
undREPO_PASS
Umgebungsvariablen verwenden. Werfen Sie einen Blick auf readme.md vom Wachtturm für weitere Informationen: github.com/v2tec/watchtower#usageIch hatte das gleiche Problem und dachte, es kann einfach durch einen
unattended-upgrade
täglichen Anruf gelöst werden .Ich beabsichtige, dies als automatische und schnelle Lösung zu verwenden, um sicherzustellen, dass der Produktionscontainer sicher und aktualisiert ist, da ich einige Zeit benötigen kann, um meine Images zu aktualisieren und ein neues Docker-Image mit den neuesten Sicherheitsupdates bereitzustellen.
Es ist auch möglich, die Image-Erstellung und -Bereitstellung mit Github-Hooks zu automatisieren
Ich habe ein einfaches Docker-Image erstellt , das täglich automatisch Sicherheitsupdates überprüft und installiert (kann direkt von ausgeführt werden
docker run itech/docker-unattended-upgrade
).Ich bin auch auf einen anderen Ansatz gestoßen, um zu überprüfen, ob der Container aktualisiert werden muss.
Meine vollständige Implementierung:
Dockerfile
Hilfsskripte
Installieren
Anfang
Bearbeiten
Ich habe ein kleines Docker- Tool entwickelt , das als Docker-Container ausgeführt wird und zum Aktualisieren von Paketen in allen oder ausgewählten laufenden Containern verwendet werden kann. Es kann auch zum Ausführen beliebiger Befehle verwendet werden.
Kann einfach mit dem folgenden Befehl getestet werden:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
Standardmäßig wird der
date
Befehl in allen laufenden Containern ausgeführt und die Ergebnisse angezeigt. Wenn Sieupdate
stattdessen übergebenexec
, wird in allen laufenden Containernapt-get update
gefolgt vonapt-get upgrade -y
ausgeführtquelle
Kubernetes
das für die Bereitstellung großer Infrastrukturen nützlich ist, aber von Google noch stark weiterentwickelt wird. Im Moment können Sie dies mit einem Bereitstellungstool wie Ansible auf relativ einfache Weise automatisieren.Sie würden nicht wissen, dass Ihr Container im Rückstand ist, ohne Docker Pull auszuführen . Dann müssten Sie Ihr Image neu erstellen oder neu zusammenstellen .
Die Befehle können zusammen mit allem anderen, was zum Abschließen des Upgrades erforderlich ist, in ein Skript eingefügt werden, obwohl für einen geeigneten Container nichts zusätzliches erforderlich wäre.
quelle
Das Abhängigkeitsmanagement für Docker-Images ist ein echtes Problem. Ich bin Teil eines Teams, das mit MicroBadger ein Tool entwickelt hat, das dabei hilft , Container-Images zu überwachen und Metadaten zu überprüfen . Eine der Funktionen besteht darin, dass Sie einen Benachrichtigungs-Webhook einrichten können, der aufgerufen wird, wenn sich ein Bild, an dem Sie interessiert sind (z. B. ein Basisbild), ändert.
quelle
Hier gibt es viele Antworten, aber keine davon entsprach meinen Bedürfnissen. Ich wollte eine tatsächliche Antwort auf die Frage Nr. 1 des Fragestellers. Woher weiß ich, wann ein Bild auf hub.docker.com aktualisiert wird?
Das folgende Skript kann täglich ausgeführt werden. Beim ersten Ausführen werden die Tags und Aktualisierungsdaten aus der HUB-Registrierung abgerufen und lokal gespeichert. Von da an überprüft es bei jeder Ausführung die Registrierung auf neue Tags und Aktualisierungsdaten. Da sich dies jedes Mal ändert, wenn ein neues Bild vorhanden ist, wird angezeigt, ob sich das Basisbild geändert hat. Hier ist das Skript:
Sie möchten die
DATAPATH
Variable oben und den E-Mail-Benachrichtigungsbefehl am Ende an Ihre Anforderungen anpassen. Für mich habe ich es SSH in einem Server in einem anderen Netzwerk, in dem sich mein SMTP befindet. Sie können denmail
Befehl aber auch problemlos verwenden .Jetzt möchten Sie auch in den Containern selbst nach aktualisierten Paketen suchen. Dies ist wahrscheinlich effektiver als ein "Ziehen", sobald Ihre Container funktionieren. Hier ist das Skript, um das durchzuziehen:
quelle
Ein anderer Ansatz könnte darin bestehen, anzunehmen, dass Ihr Basis-Image ziemlich schnell in Verzug gerät (und das ist sehr wahrscheinlich), und regelmäßig (z. B. jede Woche) einen weiteren Image-Build Ihrer Anwendung zu erzwingen und ihn dann erneut bereitzustellen, wenn er sich geändert hat.
Soweit ich das beurteilen kann, aktualisieren beliebte Basis-Images wie das offizielle Debian oder Java ihre Tags, um Sicherheitsupdates zu berücksichtigen, sodass Tags nicht unveränderlich sind (wenn Sie eine stärkere Garantie dafür wünschen, müssen Sie die Referenz [image: @digest] verwenden ], verfügbar in neueren Docker-Versionen). Wenn Sie also Ihr Image mit erstellen möchten
docker build --pull
, sollte Ihre Anwendung das neueste und beste der Basis-Image-Tags erhalten, auf die Sie verweisen.Da veränderbare Tags verwirrend sein können, ist es am besten, die Versionsnummer Ihrer Anwendung jedes Mal zu erhöhen, damit zumindest auf Ihrer Seite die Dinge sauberer werden.
Ich bin mir also nicht sicher, ob das in einer der vorherigen Antworten vorgeschlagene Skript die Aufgabe erfüllt, da es das Image Ihrer Anwendung nicht neu erstellt. Es aktualisiert lediglich das Basis-Image-Tag und startet dann den Container neu, aber der neue Container verweist weiterhin der alte Basisbild-Hash.
Ich würde nicht befürworten, Cron-Jobs in Containern (oder anderen Prozessen, sofern nicht wirklich notwendig) auszuführen, da dies gegen das Mantra verstößt, nur einen Prozess pro Container auszuführen (es gibt verschiedene Argumente, warum dies besser ist, also ich ' Ich werde hier nicht darauf eingehen.
quelle
Ich gehe nicht auf die ganze Frage ein, ob Sie unbeaufsichtigte Updates in der Produktion wünschen oder nicht (ich denke nicht). Ich lasse dies hier nur als Referenz, falls jemand es nützlich findet. Aktualisieren Sie alle Docker-Images mit dem folgenden Befehl in Ihrem Terminal auf die neueste Version:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
quelle
# docker system prune -a --volumes -f
, um alte (baumelnde) Bilder, Bände usw. zuUPDATE: Verwenden Sie Dependabot - https://dependabot.com/docker/
BLUF: Die Herausforderung besteht darin, die richtige Einfügemarke für die Überwachung von Änderungen an einem Container zu finden. Es wäre großartig, wenn DockerHub dies lösen würde. (Repository-Links wurden erwähnt, aber beachten Sie beim Einrichten in DockerHub: " Lösen Sie einen Build in diesem Repository aus, wenn das Basis-Image in Docker Hub aktualisiert wird. Funktioniert nur für nicht offizielle Images." )
Während ich versuchte, dieses Problem selbst zu lösen, sah ich einige Empfehlungen für Webhooks, daher wollte ich einige der von mir verwendeten Lösungen näher erläutern.
Verwenden Sie microbadger.com, um Änderungen in einem Container zu verfolgen, und verwenden Sie die Benachrichtigungs-Webhook-Funktion, um eine Aktion auszulösen. Ich habe dies mit zapier.com eingerichtet (Sie können jedoch jeden anpassbaren Webhook-Dienst verwenden), um ein neues Problem in meinem Github-Repository zu erstellen, das Alpine als Basis-Image verwendet.
Verfolgen Sie den RSS-Feed für Git-Commits in einem Upstream-Container. Ex. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Ich habe zapier.com verwendet, um diesen Feed zu überwachen und einen automatischen Build meines Containers in Travis-CI auszulösen, wenn etwas festgeschrieben wird. Dies ist ein wenig extrem, aber Sie können den Auslöser ändern, um andere Dinge zu tun, z. B. ein Problem in Ihrem Git-Repository für manuelle Eingriffe zu öffnen.
quelle
Voraussetzung für meine Antwort:
Ansatz
Zusätzlich kann das Basis-Image aktualisiert werden / der Container mit einem komplett neuen Basis-Image kann in regelmäßigen Abständen erstellt werden, wenn der Betreuer dies für erforderlich hält
Vorteile
quelle
Die obigen Antworten sind ebenfalls korrekt
Es gibt zwei Ansätze
Ich teile nur das Skript, vielleicht wird es für Sie hilfreich sein! Sie können es mit Cronjob verwenden, ich habe es erfolgreich unter OSX versucht
Hier ist meine Docker-Compose-Datei
quelle
Stellen Sie den Job über
$ crontab -e
:Verzeichnis
~/.docker
mit Datei erstellencron.sh
:quelle
Haben Sie dies versucht: https://github.com/v2tec/watchtower . Es ist ein einfaches Tool, das im Docker-Container ausgeführt wird und andere Container überwacht. Wenn sich das Basis-Image ändert, wird es abgerufen und erneut bereitgestellt.
quelle
Eine einfache und großartige Lösung ist Hirte
quelle