Docker: Schlechte Tipps


Als ich das Autofahren lernte, ging der Ausbilder in der ersten Lektion zurück zur Kreuzung und sagte dann, dass Sie es nicht tun sollten - überhaupt nicht. Diese Regel erinnerte ich mich sofort und lebenslang.


Sie lesen den „schlechten Rat“ für Kinder von Grigory Oster und sehen, wie einfach und natürlich es für sie ist, dass dies nicht möglich ist.


Es wurden viele Artikel darüber geschrieben, wie man Dockerfile richtig schreibt. Ich habe jedoch keine Anweisungen zum Schreiben der falschen Docker-Datei erhalten. Ich fülle diese Lücke. Und vielleicht gibt es in den Projekten, die ich zur Unterstützung bekomme, weniger solche Docker-Dateien.


Alle Helden, Situationen und Docker-Dateien sind fiktiv. Wenn Sie sich wiedererkennen, tut mir leid.


Erstellen Sie eine Docker-Datei, Ominous und Terrible


Peter (Senior Java / Ruby / PHP-Entwickler): Kollege Vasily, haben Sie bereits ein neues Modul auf Docker hochgeladen?
Basil (Junior): Nein, habe ich nicht, ich kann es mit diesem Docker nicht herausfinden. So viele Artikel darüber, meine Augen weiteten sich.


Peter: Wir haben vor einem Jahr eine Frist bekommen. Helfen wir, wir werden es dabei herausfinden. Sagen Sie mir, was Sie dort nicht tun können.


Basil: Ich kann das Grundbild nicht so auswählen, dass es minimal ist, aber es gab alles, was benötigt wurde.
Peter: Nehmen Sie das Bild von Ubuntu, es hat alles, was Sie brauchen. Und was für ein Übermaß, dann wird es nützlich sein. Und vergessen Sie nicht, das neueste Tag zu setzen, damit die Version immer die neueste ist.


Und in der Docker-Datei erscheint die erste Zeile:


FROM ubuntu:latest 

Peter: Was kommt als nächstes, worüber haben wir unser Modul geschrieben?
Basil: Also Ruby, da sollten ein Webserver und ein paar Service-Daemons starten.
Peter: Ja, was brauchen wir: Ruby, Bundler, NodeJS, Imagemagick, also was noch ... Und gleichzeitig ein Upgrade, um sicher neue Pakete zu erhalten.
Basil: Und wir werden den Benutzer nicht erstellen, also nicht von root?
Peter: Na ja, dann mach immer noch mit den Rechten rum.
Vasily: Ich brauche Zeit, ungefähr 15 Minuten, um alles in einem Team zu schaffen. Ich habe gelesen, dass ...
(Peter unterbricht grob den akribischen und sehr klugen Juni.)
Peter: Schreiben Sie in getrennten Teams, und es wird einfacher zu lesen sein.


Dockerfile wächst:


 FROM ubuntu:latest RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

Dann stürmte Igor Ivanovich ins Büro, DevOps (aber mehr Ops als Dev) und rief:


AI: Petya, deine Entwickler haben die Produktdatenbank erneut kaputt gemacht, wann endet sie ...


Nach einem kleinen Gefecht kühlt sich Igor Iwanowitsch ab und beginnt herauszufinden, was seine Kollegen hier tun.


AI: Was machst du?
Basil: Peter hilft mir beim Kompilieren einer Docker-Datei für ein neues Modul.
II: Werfen wir einen Blick darauf ... Was haben Sie hier geschrieben? Sie bereinigen das Repository mit einem separaten Befehl. Dies ist eine zusätzliche Ebene. Aber wie setzen Sie die Abhängigkeiten, wenn Sie die Gem-Datei nicht kopiert haben? Und überhaupt ist das nicht gut.
Peter: Bitte gehen Sie Ihrem Geschäft nach, wir werden es irgendwie herausfinden.


Igor Ivanovich seufzt traurig und geht, um herauszufinden, wer die Datenbank kaputt gemacht hat.


Peter: Ja, aber über den Code hat er das Richtige gesagt, Sie müssen ihn in das Bild einfügen. Und lassen Sie uns sofort ssh und Supervisor setzen, sonst starten wir die Dämonen.


Vasily: Dann kopiere ich zuerst Gemfile und Gemfile.lock, dann füge ich alles ein und kopiere dann das gesamte Projekt. Wenn sich die Gem-Datei nicht ändert, wird die Ebene aus dem Cache entfernt.
Peter: Was seid ihr alle mit diesen Ebenen, kopiert alles auf einmal. Sofort kopieren. Die erste Zeile.


Dockerfile sieht jetzt so aus:


 FROM ubuntu:latest COPY ./ /app WORKDIR /app RUN apt-get update RUN apt-get upgrade RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor RUN gem install bundler RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs RUN bundle install --without development test --path vendor/bundle RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 

Peter: Also was kommt als nächstes? Haben Sie Konfigurationen für den Supervisor?
Basil: Nein, nein. Aber ich werde es schnell tun.
Peter: Dann mach es. Lassen Sie uns nun das Init-Skript skizzieren, mit dem alles ausgeführt wird. Damit starten Sie ssh mit nohup, damit wir uns mit dem Container verbinden und sehen können, was schief gelaufen ist. Dann starten Sie auch Supervisor. Na dann einfach Passagier laufen lassen.
F: Aber ich habe gelesen, dass es einen Prozess geben sollte, damit Docker weiß, dass etwas schief gelaufen ist, und den Container neu starten kann.
P: Kümmere dich nicht um deinen Kopf. Und im Allgemeinen, wie? Wie läuft alles in einem Prozess ab? Lassen Sie Igor Iwanowitsch über Stabilität nachdenken, nicht umsonst, dass er ein Gehalt erhält. Unser Geschäft ist es, Code zu schreiben. Und trotzdem, lassen Sie ihn sich dafür bedanken, dass er das Dockefile für ihn geschrieben hat.


Nach 10 Minuten und zwei Videos über Katzen.


F: Ich habe alles getan. Ich habe auch Kommentare hinzugefügt.
P: Zeigen!


Neue Version von Dockerfile:


 FROM ubuntu:latest #    COPY ./ /app WORKDIR /app #    RUN apt-get update #   RUN apt-get upgrade #    RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor #  bundler RUN gem install bundler #  nodejs     RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash - RUN apt-get install -y nodejs #   RUN bundle install --without development test --path vendor/bundle #     RUN rm -rf /usr/local/bundle/cache/*.gem RUN apt-get clean RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* #  ,   ,    . CMD [“/app/init.sh”] 

P: Großartig, ich mag es. Und die Kommentare auf Russisch sind bequem und lesbar, jeder würde so arbeiten. Ich habe dir alles beigebracht, dann kannst du es selbst machen. Lass uns Kaffee trinken gehen ...


Nun, hier haben wir eine absolut schreckliche Docker-Datei, aus deren Sicht Igor Iwanowitsch aufhören will und seine Augen für eine weitere Woche schmerzen werden. Dockerfile könnte natürlich noch schlimmer sein, der Perfektion sind keine Grenzen gesetzt. Aber für den Anfang wird es reichen.


Ich möchte mit einem Zitat von Gregory Oster enden:


Wenn Sie noch nicht fest sind
Sie haben den Weg im Leben gewählt,
Und du weißt nicht warum
Arbeiten Sie sich vor, um zu beginnen,
Schlagen Sie die Lichter in den Veranden -
Die Leute werden Danke sagen.
Sie werden den Menschen helfen
Strom schützen.


UPD : In den Kommentaren wird gefragt, was mit diesen Docker-Dateien nicht stimmt. Neulich werde ich einen separaten Artikel mit einer Analyse der Fehler schreiben.

Source: https://habr.com/ru/post/de449944/


All Articles