Frage Docker: Was sind die besten Vorgehensweisen beim Markieren von Bildern für eine Umgebung?


Ich habe mehrere Umgebungen. Sie sind debug, dev und prod. Ich würde gerne auf ein Bild mit dem neuesten Entwickler (neuste) oder Entwickler (Version 1.1) oder Produkt (neueste) verweisen. Wie würde ich Builds und Pushs taggen?

Mein erster Gedanke war, separate Repositories für jede Umgebung zu erstellen, debug, dev und prod. Aber ich frage mich, ob ich das mit nur einem Repository machen kann. Wenn es möglich ist, mit einem Container zu arbeiten, wie wäre die Syntax beim Bauen und Schieben?


5
2018-06-12 22:00


Ursprung


Antworten:


Das hat für mich und mein Team am besten funktioniert und ich empfehle es:

Ich empfehle es ein einzelnes Repo pro Projekt für alle UmgebungenEs ist einfacher zu verwalten. Vor allem wenn Sie Microservices haben, besteht Ihr Projekt aus mehreren Microservices. Die Verwaltung eines Repos pro Projekt ist mühsam.

Zum Beispiel habe ich eine Benutzer-API. Das Docker Repo ist users. Und dieses Repo wird von verwendet alpha, dev und beta.

Wir erstellen eine env Variable namens $DOCKER_TAG in unserem CI / CD-Dienst und setze es zu dem Zeitpunkt, zu dem der Build erstellt wird, so:

DOCKER_TAG: $(date +%Y%m%d).$BUILD_NUMBER => Das ist in bash.

Woher $BUILD_NUMBER wird zuvor vom Build festgelegt, der ausgeführt wird, wenn der CI / CD-Lauf ausgelöst wird. Zum Beispiel, wenn wir ein PR zusammenführen, wird ein Build ausgelöst, als Build-Nr. 1, so $BUILD_NUMBER: 1.

Das resultierende Tag sieht folgendermaßen aus: 20171612.1 so unser Docker Bild ist: users:20171612.1

Warum dieses Format?

  • Es ermöglicht uns, das gleiche Tag in verschiedenen Umgebungen mit einem zu implementieren Aufgabe ausführen.
  • Es hilft uns, den Überblick zu behalten, wann ein Bild erstellt wurde und was bau es gehört zu.
  • Durch die Build-Nummer können wir die Commit-Informationen finden und alle nach Bedarf zusammenstellen, um Troubleshooting zu ermöglichen.
  • Es ermöglicht uns, das gleiche Docker Repo pro Projekt zu verwenden.
  • Es ist schön zu wissen, wann wir das Bild vom Tag selbst erstellt haben.

Wenn wir zusammenführen, erstellen wir einen einzelnen Build. Dann wird dieser Build nach Bedarf für die verschiedenen Umgebungen bereitgestellt. Wir erstellen keinen unabhängigen Build pro Umgebung. Und wir behalten den Überblick darüber, was wo eingesetzt wird.

Wenn es in einer Umgebung mit einem bestimmten Tag einen Fehler gibt, ziehen wir ein solches Tag, erstellen und trobeln und reproduzieren das Problem unter dieser Bedingung. Wenn wir ein Problem finden, haben wir die Build-Nummer im Tag 20171612.1 also kennen wir die Build-Nr. 1 hat das Problem. Wir überprüfen unseren CI / CD-Dienst und das zeigt uns, was Commit am aktuellsten ist. Wir überprüfen, ob der Hash-Code von git commit und debuggt und behebt das Problem. Dann stellen wir es zum Beispiel als Hotfix bereit.

Wenn Sie noch keine CI / CD haben und dies manuell tun, setzen Sie das Tag einfach in diesem Format manuell (geben Sie so viel wie möglich den vollständigen String ein) und verwenden Sie statt einer Build-Nummer einen Commit-Short-Git-Hash (wenn du git verwendest):

20170612.ed73d4f

Sie wissen also, was das aktuellste Commit ist, damit Sie Probleme mit einem bestimmten Image beheben und den Code erneut zuordnen können, um Fixes nach Bedarf zu erstellen.

Sie können auch ein beliebiges anderes Suffix für Ihr Tag definieren, das der Codeversion zugeordnet ist. So können Sie problemlos Fehler beheben (z. B. wenn Sie Git-Tags verwenden, wenn Sie diese verwenden).

Probieren Sie es aus, stellen Sie es nach Bedarf ein und tun Sie, was für Sie und Ihr Team am besten funktioniert. Es gibt viele Möglichkeiten zum Tagging. Wir haben viele ausprobiert und dieses ist bis jetzt unser Favorit.

Hoffe das ist hilfreich.


12
2018-06-12 22:35



Ich denke "lastest" ist für das letzte produktive Bild. Es ist, was ich im Docker-Hub erwarte, obwohl es keine Bilder in der Entwicklung gibt.

Auf der anderen Seite können Sie Tags wie zB 0.0.1-dev verwenden. Wenn dieses Bild fertig ist, können Sie das Tag erneut ausführen und drücken, und das Repository erkennt dann, dass sich die Layer bereits im Repository befinden.

Wenn Sie jetzt über eine Kandidatenversion sprechen, um in die Produktion zu kommen, müssen Sie nur die semantische Version haben, obwohl Sie nicht in einer Umgebungspruduccion sind. Das würde ich tun.


1
2018-06-12 22:44



Es gibt zwei Denkschulen, eine stabile Tagging-Funktion, bei der Sie ein einzelnes Tag aktualisieren und ein eindeutiges Tagging. Jeder hat seine Vor- und Nachteile. Stabile Tags können bei der Bereitstellung in selbstheilenden Clustern zu Instabilität führen, da ein neuer Knoten eine neue Version abrufen kann, während der Rest des Clusters eine etwas ältere Version ausführt. Die eindeutige Kennzeichnung ist eine bewährte Methode für die Bereitstellung. Um Basis-Image-Updates von OS & Framework-Patches zu verwalten, sollten Sie jedoch stabile Tags in Ihrer Docker-Datei erstellen und automatische Container-Builds aktivieren. Für einen detaillierteren Spaziergang, mit Visuals, hier ist ein Post: https://blogs.msdn.microsoft.com/stevelasker/2018/03/01/docker-tagging-best-practices-for-tagging-and-versioning-docker-images/


1
2018-03-12 16:30