Ich bin ein bisschen verwirrt über diese beiden Optionen. Sie scheinen verwandt zu sein. Sie sind jedoch nicht wirklich kompatibel.
Zum Beispiel scheint es, dass die Verwendung von Dockerfiles bedeutet, dass Sie sich nicht wirklich auf Bilder festlegen sollten, da Sie die Dockerfile wirklich nur in Git verfolgen und Änderungen daran vornehmen sollten. Dann gibt es keine Unklarheit darüber, was maßgeblich ist.
Image-Commits scheinen jedoch sehr nett zu sein. Es ist so großartig, dass Sie einfach einen Container direkt ändern und die Änderungen markieren können, um ein anderes Bild zu erstellen. Ich verstehe, dass Sie sogar so etwas wie ein Dateisystem von einem Image-Commit-Verlauf unterscheiden können. Genial. Aber dann sollten Sie keine Docker-Dateien verwenden. Andernfalls müssten Sie, wenn Sie ein Image-Commit durchgeführt haben, zu Ihrer Docker-Datei zurückkehren und einige Änderungen vornehmen, die das darstellen, was Sie getan haben.
Also bin ich hin und her gerissen. Ich liebe die Idee von Image Commits: Sie müssen Ihren Bildstatus nicht in einer Docker-Datei darstellen - Sie können ihn einfach direkt verfolgen. Es ist mir jedoch unangenehm, die Idee einer Manifestdatei aufzugeben, die Ihnen einen schnellen Überblick über die Inhalte eines Bildes gibt. Es ist auch beunruhigend, zwei Funktionen im selben Softwarepaket zu sehen, die nicht kompatibel zu sein scheinen.
Hat jemand irgendwelche Gedanken dazu? Wird es als schlechte Praxis angesehen, Image-Commits zu verwenden? Oder sollte ich einfach meinen Anhang loslassen, um Dateien aus meinen Puppet-Tagen zu manifestieren? Was soll ich machen?
Update :
Allen, die dies für eine meinungsbasierte Frage halten, bin ich mir nicht so sicher. Es gibt einige subjektive Eigenschaften, aber ich denke, es ist meistens eine objektive Frage. Darüber hinaus glaube ich, dass eine gute Diskussion zu diesem Thema informativ sein wird.
Am Ende hoffe ich, dass jeder, der diesen Beitrag liest, ein besseres Verständnis dafür bekommt, wie Dockerfiles und Image-Commits miteinander zusammenhängen.
Update - 18.07.2017 :
Ich habe kürzlich eine legitime Verwendung für Image-Commits entdeckt. Wir haben gerade eine CI-Pipeline in unserem Unternehmen eingerichtet und während einer Phase der Pipeline werden unsere App-Tests in einem Container ausgeführt. Wir müssen die Abdeckungsergebnisse aus dem verlassenen Container abrufen, nachdem der Test-Runner-Prozess sie generiert hat (im Dateisystem des Containers) und der Container nicht mehr ausgeführt wird. Dazu verwenden wir Image-Commits, indem wir den gestoppten Container festschreiben, um ein neues Image zu erstellen, und dann Befehle ausführen, mit denen die Coverage-Datei angezeigt und an stdout ausgegeben wird. Das ist also praktisch. Abgesehen von diesem sehr speziellen Fall verwenden wir Dockerfiles, um unsere Umgebungen zu definieren.
Antworten:
Dockerfiles sind ein Tool zum Erstellen von Bildern.
Das Ergebnis der Ausführung
docker build .
ist ein Image mit einem Commit, sodass es nicht möglich ist, eine Docker-Datei zu verwenden, ohne ein Commit zu erstellen . Die Frage ist, ob Sie das Bild jedes Mal von Hand aktualisieren sollten, wenn sich etwas ändert, und sich so zum Fluch des goldenen Bildes verurteilen sollten .Der Fluch des goldenen Bildes ist ein schrecklicher Fluch, der auf Menschen geworfen wird, die weiterhin mit einem von Sicherheitslücken übersäten Basisbild leben müssen, um ihre Software auszuführen, weil die Person, die es erstellt hat, vor langer Zeit von den Alten verschlungen wurde (oder zu einem übergegangen ist) neuer Job) und niemand weiß, woher sie die Version von Imagemagic haben, die in dieses Bild eingeflossen ist. und ist das einzige, was mit dem c ++ - Modul verknüpft ist, das von dem Berater bereitgestellt wurde, den der Sohn des Chefs vor drei Jahren eingestellt hat, und es spielt sowieso keine Rolle, denn selbst wenn Sie herausgefunden haben, woher Imagemagic aus der von libstdc ++ verwendeten Version stammt JNI ruft das Support-Tool auf, das intern mit den erstellten langen Haaren nur in einer nicht unterstützten Version von Ubuntu vorhanden ist.
quelle
Es ist ein guter Anfang, die Vorteile und Unannehmlichkeiten beider Lösungen zu kennen. Denn eine Mischung aus beidem ist wahrscheinlich ein gültiger Weg.
Con: Vermeiden Sie die Sackgasse des goldenen Bildes :
Es ist schlecht, nur Commits zu verwenden, wenn Sie nicht mehr wissen, wie Sie Ihr Image neu erstellen können. Sie möchten nicht in dem Zustand sein, in dem Sie das Image nicht neu erstellen können . Dieser Endzustand wird hier als goldenes Bild bezeichnet, da das Bild in jeder Phase Ihre einzige Referenz, Ihr Start- und Endpunkt ist. Wenn Sie es verlieren, werden Sie in große Schwierigkeiten geraten, da Sie es nicht wieder aufbauen können. Die fatale Sackgasse ist, dass Sie eines Tages eine neue erstellen müssen (weil beispielsweise alle Systembibliotheken veraltet sind) und Sie keine Ahnung haben, was Sie installieren sollen ... was zu einem großen Zeitverlust führt.
Als Randnotiz ist es wahrscheinlich, dass die Verwendung von Commits über Commits besser wäre, wenn das Verlaufsprotokoll leicht verwendet werden könnte (konsultieren Sie Unterschiede und wiederholen Sie sie auf anderen Bildern), wie es in git ist: Sie werden feststellen, dass git keine hat dieses Dilemma.
Pro: Schnelle Upgrades zum Verteilen
Auf der anderen Seite haben Layering-Commits einen erheblichen Vorteil in Bezug auf verteilte Upgrades und damit in Bezug auf Bandbreite und Bereitstellungszeit. Wenn Sie anfangen, Docker-Images zu verarbeiten, während ein Bäcker Pfannkuchen verarbeitet (was genau das ist, was Docker zulässt), oder wenn Sie die Testversion sofort bereitstellen möchten, senden Sie gerne nur ein kleines Update in Form eines kleinen Commits ganz neues Bild. Besonders wenn Sie eine kontinuierliche Integration für Ihre Kunden haben, bei der Fehlerbehebungen bald und häufig bereitgestellt werden sollten.
Versuchen Sie, das Beste aus zwei Welten herauszuholen:
In solchen Szenarien möchten Sie wahrscheinlich die Hauptversion Ihrer Bilder markieren , und sie sollten von stammen
Dockerfiles
. Dank Commits, die auf der getaggten Version basieren, können Sie Versionen für die kontinuierliche Integration bereitstellen. Dies verringert die Vor- und Nachteile von Dockerfiles und Layering Commits. Hier ist der entscheidende Punkt, dass Sie nie aufhören, Ihre Bilder im Auge zu behalten, indem Sie die Anzahl der Commits begrenzen, die Sie für sie ausführen dürfen.Ich denke, es hängt von Ihrem Szenario ab, und Sie sollten wahrscheinlich nicht versuchen, eine einzige Regel zu finden. Es kann jedoch einige echte Sackgassen geben, die Sie wirklich vermeiden sollten (da dies zu einem "goldenen Bild" -Szenario führt), unabhängig von der Lösung.
quelle