
Als ich Autofahren lernte, ist mein Fahrlehrer gleich in der ersten Stunde rĂŒckwĂ€rts an eine Kreuzung gefahren und hat dann gesagt, dass man das auf keinen Fall machen darf â niemals. Diese Regel habe ich sofort und fĂŒrs Leben gelernt.
Wenn man Kindern "SchÀdliche Tipps" von Grigori Oster vorliest, sieht man, wie leicht und unbeschwert sie verstehen, dass man so etwas nicht tun sollte.
Es gibt eine Menge Artikel darĂŒber, wie man ein Dockerfile richtig schreibt. Aber ich habe keine Anleitungen gefunden, wie man ein falsches Dockerfile schreibt. Ich schlieĂe diese LĂŒcke. Und vielleicht wird es weniger solcher Dockerfiles in den Projekten geben, die ich unterstĂŒtze.
Alle Charaktere, Situationen und Dockerfiles sind fiktiv. Wenn Sie sich erkannt haben, tut mir leid.
Erstellen wir ein Dockerfile, furchtbar und schrecklich
Peter (Senior Java/Ruby/PHP-Entwickler): Kollege Wladimir, hast du das neue Modul schon in Docker hochgeladen?
Wladimir (Junior): Nein, ich hatte keine Zeit, ich komme mit Docker einfach nicht klar. So viele Artikel, dass mir ganz schwindelig wird.
Peter: Unsere Frist ist schon vor einem Jahr abgelaufen. Lass mich helfen, wir klÀren das wÀhrenddessen. ErzÀhl mir, was bei dir nicht funktioniert.
Wladimir: Ich kann kein Basissystem auswÀhlen, ich möchte ein minimales, aber alles Wichtige muss da sein.
Peter: Nimm das Ubuntu-Image, darin ist alles, was du brauchst. Das, was ĂŒberflĂŒssig ist, könnte spĂ€ter nĂŒtzlich sein. Und vergiss nicht, den Tag 'latest' zu setzen, damit es immer die neueste Version ist.
Und in der Dockerfile erscheint die erste Zeile:
FROM ubuntu:latestPeter: Was kommt als nÀchstes, womit haben wir unser Modul geschrieben?
Wassilij: Mit Ruby, da muss ein Webserver und ein paar Dienstprozesse laufen.
Peter: Aha, was wir brauchen: Ruby, Bundler, Node.js, ImageMagick und was da sonst noch ⊠Und auĂerdem, mach ein Upgrade, um sicher die neuesten Pakete zu bekommen.
Wassilij: Sollen wir keinen Benutzer anlegen, damit wir nicht als root arbeiten?
Peter: Lass das, das ist spÀter nur ein weiteres Problem mit den Rechten.
Wassilij: Ich brauche ein wenig Zeit, etwa 15 Minuten, um das alles in einen Befehl zu packen. Ich habe gelesen, dassâŠ
(Peter unterbricht den ĂŒbergenauen und sehr cleveren Junior grob.)
Peter: Schreib es in einzelnen Befehlen, so lÀsst es sich einfacher lesen.
Die 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/*Hier stĂŒrmt Igor Ivanovitch, DevOps (aber mehr Ops als Dev), in den Raum und schreit:
KI: Peter, deine Entwickler haben die Produktionsdatenbank schon wieder kaputtgemacht. Wann hört das endlich aufâŠ
Nach einem kleinen Wortgefecht beruhigt sich Igor Ivanovich und fragt nach, was die Kollegen hier gerade tun.
KI: Womit sind Sie beschÀftigt?
Wasilij: Peter hilft mir, ein Dockerfile fĂŒr das neue Modul zu erstellen.
KI: Lass mich mal sehen⊠Was habt ihr denn hier geschrieben? Ihr reinigt das Repository doch mit einem eigenen Befehl, das ist doch eine zusÀtzliche Ebene⊠Wie stellt ihr die AbhÀngigkeiten ein, wenn ihr die Gemfile nicht kopiert habt! Das ist alles nicht akzeptabel.
Peter: Gehen Sie bitte Ihren eigenen Angelegenheiten nach, wir kriegen das hier schon irgendwie hin.
Igor Ivanovich seufzt bedrĂŒckt und geht herauszufinden, wer die Datenbank kaputtgemacht hat.
Peter: Ja, aber er hat bezĂŒglich des Codes recht, wir sollten ihn ins Image packen. Und lass uns gleich SSH und Supervisor installieren, wie sollen wir sonst die Prozesse starten?
Wasilij: Ich kopiere zuerst die Gemfile und die Gemfile.lock, installiere dann alles und kopiere danach das gesamte Projekt. Wenn sich die Gemfile nicht Ă€ndert, wird die Schicht aus dem Cache ĂŒbernommen.
Peter: Was habt ihr alle mit diesen Schichten? Kopiere sofort alles. Sofort kopieren. In der ersten Zeile.
Das Dockerfile sieht jetzt so aus:
VON 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: Und, was kommt jetzt? Hast du die Konfigurationen fĂŒr den Supervisor?
Wasilij: Nein, habe ich nicht. Aber ich mache es schnell.
Peter: Mach es spĂ€ter. Lass uns jetzt das Init-Skript skizzieren, das alles starten wird. Also, du startest ssh mit nohup, damit wir uns mit dem Container verbinden und sehen können, was schiefgelaufen ist. Dann startest du auch den Supervisor. Und schlieĂlich startest du einfach den Passenger.
W: Aber ich habe gelesen, dass es einen Prozess geben sollte, damit Docker weiĂ, dass etwas schiefgelaufen ist und den Container neu starten kann.
P: Mach dir keine Gedanken ĂŒber so einen Blödsinn. Und ĂŒberhaupt, wie? Wie wirst du das alles in einem Prozess starten? Lass Igor Ivanovich sich um die StabilitĂ€t kĂŒmmern, er wird schlieĂlich dafĂŒr bezahlt. Unsere Aufgabe ist es, Code zu schreiben. Und er sollte dankbar sein, dass wir ihm das Dockerfile geschrieben haben.
Zehn Minuten spĂ€ter und zwei Videos ĂŒber Katzen.
W: Ich habe alles gemacht. Ich habe auch ein paar Kommentare hinzugefĂŒgt.
P: Zeig her!
Aktuelle Version des Dockerfile:
FROM ubuntu:latest
# Kopieren Sie den Quellcode
COPY ./ /app
WORKDIR /app
# Aktualisieren Sie die Paketliste
RUN apt-get update
# Pakete aktualisieren
RUN apt-get upgrade
# Benötigte Pakete installieren
RUN apt-get -y install libpq-dev imagemagick gsfonts ruby-full ssh supervisor
# Bundler installieren
RUN gem install bundler
# Node.js installieren, das fĂŒr das Bauen von Statischen Inhalten verwendet wird
RUN curl -sL https://deb.nodesource.com/setup_9.x | sudo bash -
RUN apt-get install -y nodejs
# AbhÀngigkeiten installieren
RUN bundle install --without development test --path vendor/bundle
# Caches aufrÀumen
RUN rm -rf /usr/local/bundle/cache/*.gem
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
# FĂŒhren Sie ein Skript beim Starten des Containers aus, das alles andere starten wird.
CMD ["/app/init.sh"]P: Das ist groĂartig, ich mag es. Und die Kommentare auf Russisch sind praktisch und leserlich, jeder sollte so arbeiten. Ich habe dir alles beigebracht, du kannst jetzt selbst weitermachen. Lass uns einen Kaffee trinken...
Nun, da haben wir die perfekt schreckliche Dockerfile, bei deren Anblick Igor Ivanovich kĂŒndigen möchte und seine Augen noch eine Woche schmerzen werden. Die Dockerfile hĂ€tte natĂŒrlich noch schlimmer sein können, es gibt keine Grenze fĂŒr die Perfektion. Aber fĂŒr den Anfang ist das schon in Ordnung.
Ich möchte abschlieĂend mit einem Zitat von Grigori Oster enden:
Wenn Sie sich noch nicht sicher sind,
Welchen Weg Sie im Leben gewÀhlt haben,
Und nicht wissen, wo Sie anfangen sollen,
Ihren Arbeitsweg zu beginnen,
Schlagen Sie die GlĂŒhbirnen in den TreppenhĂ€usern ein â
Die Leute werden Ihnen âDankeâ sagen.
Sie helfen den Menschen,
Strom zu sparen.
Quelle: habr.com
