Soll ich Dockerfiles oder Image Commits verwenden?


79

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.


2
Hier gibt es viel Philosophie, und die Philosophien der Menschen unterscheiden sich, was dies für SO vielleicht zu einer schlechten Frage macht. Meine eigene Philosophie: Sie möchten immer genau wissen, wie ein bestimmtes Bild reproduziert wird, und sicher sein, dass Sie dies tun können . Mit goldenen Bildern ist es sehr, sehr einfach, nicht zu wissen, wie jemand von Zustand A zu Zustand B gekommen ist, während es bei einer Automatisierung, die den Erstellungsprozess steuert, keine Möglichkeit gibt, dies zu vergessen. Also, persönlich, ja, ich nenne Dockerfiles das Richtige, und das Image begeht (wie jede Art von goldenem Image, das auf manuellen Eingriffen beruht, um es zu erstellen) das Böse. Aber das bin ich und YMMV.
Charles Duffy

@CharlesDuffy Wohin soll diese Frage gehen, wenn sie nicht zu SO gehört?
David Sanders

1
@ CharlesDuffy Übrigens stimme ich nicht zu, dass dies eine meinungsbasierte Frage ist. Hier sollte es eine richtige Antwort geben, wenn nicht eine richtige Antwort, die von etwas mehr Kontext abhängt. Zu Ihrer Information, ich habe abgestimmt, um meine Frage auf Serverfault zu verschieben.
David Sanders

2
...*zucken*. Ich kann konkrete Gründe für meine Präferenz anführen, aber macht das sie richtiger als die konkreten Gründe, die jemand anderes für ihre anführt? Ich habe mit Leuten zusammengearbeitet, die Fans des Golden-Image-Ansatzes sind, und es ist nicht immer möglich, jemanden durch Zitieren von Fakten zu überzeugen, da Parteien unterschiedliche Merkmale in einer Lösung in unterschiedlichem Ausmaß bewerten können, sodass es durchaus möglich ist, sich auf Fakten zu einigen aber nicht einverstanden über Schlussfolgerungen. Welches ist das Markenzeichen einer meinungsbasierten Frage und was erwarte ich, wenn hier tatsächlich goldene Image-Fans auftauchen?
Charles Duffy

1
Ich habe mich das Gleiche gefragt und meinen Eindruck (was völlig falsch sein könnte), dass es wirklich der gleiche Fall ist wie bei vms -> Sie möchten nicht wissen, wie Sie das VM-Image neu erstellen können. In meinem Fall muss ich regelmäßig .sh-Skripte installieren und frage mich, warum ich diese nicht einfach warten, Docker ausführen und diese effektiv aufrufen und auf diese Weise das goldene Versionsabbild erstellen kann. Meine Skripte arbeiten, um es auf einem lokalen PC zu installieren, und der Grund, warum ich Docker verwenden möchte, ist, Konflikte mit mehreren Instanzen von Programmen zu behandeln / ein sauberes Dateisystem zu haben / usw.
Bradford Medeiros

Antworten:


47

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.


3
Dies scheint mir tatsächlich das Herzstück des Problems zu sein. Wenn Sie ausschließlich Image-Commits verwenden, bleiben Sie bei Ihrem Basis-Image hängen. Sie könnten ein Dist-Upgrade für das Image durchführen, aber das klingt nur nach einem Albtraum. Es scheint weitaus vorzuziehen, diese Art von Informationen in einer Docker-Datei sauber darzustellen. Ich denke, Docker sollte Image Commits nicht als Teil seiner öffentlichen API verfügbar machen. Es scheint nur keine legitime Verwendung für sie zu geben, außer zu Illustrationszwecken in der einleitenden Dokumentation.
David Sanders

7
Ich habe mir dieses Beispiel nicht nur ausgedacht ... :-(
Arthur Ulfeldt

22

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.


Erstellt Docker nicht auf intelligente Weise Images neu, sodass Sie nach der Neuerstellung aus einer geänderten Docker-Datei kein neues Image herunterladen müssen, um sie bereitzustellen?
David Sanders

1
@DavidSanders Sie werden nicht mit dem Herunterladen ganz neuer Bilder enden, da haben Sie Recht. Aber jede frühe Anweisung, die zu Änderungen führt, macht die gesamten folgenden Schichten ungültig. Bekanntlich handelt es sich bei 'ADD' oder einer Abhängigkeitsanweisung häufig um Anweisungen, die Sie am Ende mit einem einzelnen neuen Commit ausführen können. Wenn Sie jedoch Ihre Docker-Datei neu erstellen, werden ganz neue Ebenen generiert. Einige Anstrengungen unternommen worden um ‚ADD‘ klüger sein github.com/docker/docker/issues/880 , siehe auch folgende ähnliche Bedenken jpetazzo.github.io/2013/12/01/docker-python-pip-requirements
Vaab
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.