Ντόκερ: κακή συμβουλή

Ντόκερ: κακή συμβουλή

Όταν μάθαινα να οδηγώ αυτοκίνητο, στο πρώτο μάθημα ο εκπαιδευτής οδήγησε στη διασταύρωση με την όπισθεν και μετά είπε ότι δεν πρέπει να το κάνεις αυτό - ποτέ καθόλου. Θυμήθηκα αυτόν τον κανόνα αμέσως και για το υπόλοιπο της ζωής μου.

Διαβάζετε το «Bad Advice» του Γκριγκόρι Όστερ στα παιδιά και βλέπετε πόσο εύκολα και φυσικά τα ξημερώνει ότι δεν πρέπει να το κάνουν αυτό.

Έχουν γραφτεί πολλά άρθρα σχετικά με το πώς να γράψετε σωστά ένα Dockerfile. Αλλά δεν βρήκα οδηγίες για το πώς να γράφω λανθασμένα Dockerfiles. Αναπληρώνω αυτό το κενό. Και ίσως στα έργα που λαμβάνω υποστήριξη, να υπάρχουν λιγότερα τέτοια dockerfiles.

Όλοι οι χαρακτήρες, οι καταστάσεις και το Dockerfile είναι πλασματικοί. Εάν αναγνωρίζετε τον εαυτό σας, συγγνώμη.

Δημιουργώντας ένα Dockerfile, δυσοίωνο και τρομερό

Peter (Ανώτερος προγραμματιστής java/rubby/php): Συνάδελφε Vasily, έχεις ήδη ανεβάσει μια νέα ενότητα στο Docker;
Vasily (junior): Όχι, δεν είχα χρόνο, δεν μπορώ να το καταλάβω με αυτό το Docker. Υπάρχουν τόσα πολλά άρθρα σχετικά με αυτό, είναι ιλιγγιώδες.

Peter: Είχαμε μια προθεσμία πριν από ένα χρόνο. Επιτρέψτε μου να σας βοηθήσω, θα το καταλάβουμε στη διαδικασία. Πες μου τι δεν σου πάει.

Vasily: Δεν μπορώ να διαλέξω μια βασική εικόνα ώστε να είναι minimal, αλλά να έχει όλα όσα χρειάζεστε.
Peter: Πάρτε την εικόνα του ubuntu, έχει όλα όσα χρειάζεστε. Και ό,τι είναι πολλά περιττά πράγματα θα φανούν χρήσιμα αργότερα. Και μην ξεχάσετε να βάλετε την πιο πρόσφατη ετικέτα, ώστε η έκδοση να είναι πάντα η πιο πρόσφατη.

Και η πρώτη γραμμή εμφανίζεται στο Dockerfile:

FROM ubuntu:latest

Peter: Τι ακολουθεί, τι χρησιμοποιήσαμε για να γράψουμε την ενότητα μας;
Vasily: Λοιπόν, Ruby, υπάρχει ένας διακομιστής ιστού και θα πρέπει να λανσαριστούν μερικοί δαίμονες υπηρεσιών.
Peter: Ναι, τι χρειαζόμαστε: ruby, bundler, nodejs, imagemagick και τι άλλο... Και ταυτόχρονα, κάντε μια αναβάθμιση για να αποκτήσετε σίγουρα νέα πακέτα.
Vasily: Και δεν θα δημιουργήσουμε χρήστη για να μην είμαστε κάτω από το root;
Πέτρος: Γάμησέ το, τότε πρέπει ακόμα να χαζεύεις τα δικαιώματα.
Vasily: Χρειάζομαι χρόνο, περίπου 15 λεπτά, για να τα βάλω όλα μαζί σε μια εντολή, διάβασα ότι...
(Ο Πίτερ διακόπτει αγενώς τον σχολαστικό και πολύ έξυπνο junior.)
Peter: Γράψε σε ξεχωριστές εντολές, θα είναι πιο εύκολο να διαβαστεί.

Το Dockerfile μεγαλώνει:

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/*

Τότε ο Igor Ivanovich, DevOps (αλλά περισσότεροι Ops από Dev), μπαίνει στο γραφείο φωνάζοντας:

AI: Petya, οι προγραμματιστές σας έσπασαν ξανά τη βάση δεδομένων τροφίμων, πότε θα τελειώσει αυτό...

Μετά από μια μικρή αψιμαχία, ο Ιγκόρ Ιβάνοβιτς ξεψυχάει και αρχίζει να ανακαλύπτει τι κάνουν οι συνάδελφοί του εδώ.

ΑΙ: Τι κάνεις;
Vasily: Ο Peter με βοηθά να δημιουργήσω ένα Dockerfile για μια νέα ενότητα.
AI: Επιτρέψτε μου να ρίξω μια ματιά... Τι γράψατε εδώ, καθαρίζετε το αποθετήριο με μια ξεχωριστή εντολή, αυτό είναι ένα πρόσθετο επίπεδο... Αλλά πώς μπορείτε να εγκαταστήσετε εξαρτήσεις αν δεν έχετε αντιγράψει το Gemfile! Και γενικά, αυτό δεν είναι καλό.
Peter: Παρακαλώ, προχωρήστε στην επιχείρησή σας, θα το καταλάβουμε με κάποιο τρόπο.

Ο Ιγκόρ Ιβάνοβιτς αναστενάζει λυπημένος και φεύγει για να βρει ποιος έσπασε τη βάση δεδομένων.

Peter: Ναι, αλλά είχε δίκιο για τον κώδικα, πρέπει να τον προωθήσουμε στην εικόνα. Και ας εγκαταστήσουμε αμέσως το ssh και τον επόπτη, διαφορετικά θα ξεκινήσουμε τους δαίμονες.

Vasily: Τότε θα αντιγράψω πρώτα το Gemfile και το Gemfile.lock, μετά θα εγκαταστήσω τα πάντα και μετά θα αντιγράψω ολόκληρο το έργο. Εάν το Gemfile δεν αλλάξει, το επίπεδο θα ληφθεί από τη μνήμη cache.
Peter: Γιατί είστε όλοι με αυτά τα επίπεδα, αντιγράψτε τα πάντα ταυτόχρονα. Αντιγράψτε αμέσως. Η πρώτη γραμμή.

Το 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
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: Λοιπόν, τι μετά; Έχετε ρυθμίσεις για τον επόπτη;
Βασίλι: Όχι, όχι. Αλλά θα το κάνω γρήγορα.
Πέτρος: Τότε θα το κάνεις. Ας σκιαγραφήσουμε τώρα ένα σενάριο init που θα εκκινήσει τα πάντα. Εντάξει, ξεκινάς το ssh, με το nohup, για να συνδεθούμε στο κοντέινερ και να δούμε τι πήγε στραβά. Στη συνέχεια, εκτελέστε τον επόπτη με τον ίδιο τρόπο. Λοιπόν, τότε απλά τρέχεις επιβάτη.
Ε: Αλλά διάβασα ότι πρέπει να υπάρχει μία διαδικασία, οπότε ο Docker θα γνωρίζει ότι κάτι πήγε στραβά και μπορεί να επανεκκινήσει το κοντέινερ.
Π: Μην κουράζεις το κεφάλι σου με βλακείες. Και γενικά πώς; Πώς τα τρέχετε όλα αυτά σε μια διαδικασία; Αφήστε τον Ιγκόρ Ιβάνοβιτς να σκεφτεί τη σταθερότητα, δεν είναι για τίποτα που λαμβάνει μισθό. Η δουλειά μας είναι να γράφουμε κώδικα. Και γενικά, ας πει ευχαριστώ που του γράψαμε το Dockfile.

10 λεπτά και δύο βίντεο για γάτες αργότερα.

Ε: Έχω κάνει τα πάντα. Πρόσθεσα περισσότερα σχόλια.
Π: Δείξε μου!

Τελευταία έκδοση του 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”]

Π: Μπράβο, μου αρέσει. Και τα σχόλια είναι στα ρωσικά, βολικά και ευανάγνωστα, όλοι θα δούλευαν έτσι. Σου έμαθα τα πάντα, τα υπόλοιπα μπορείς να τα κάνεις μόνος σου. Πάμε για καφέ...

Λοιπόν, τώρα έχουμε ένα τρομερό Dockerfile, το θέαμα του οποίου θα κάνει τον Igor Ivanovich να θέλει να τα παρατήσει και τα μάτια του θα πονούν για άλλη μια εβδομάδα. Το Dockerfile, φυσικά, θα μπορούσε να είναι ακόμα χειρότερο, δεν υπάρχει όριο στην τελειότητα. Αλλά για αρχή, αυτό θα γίνει.

Θα ήθελα να τελειώσω με ένα απόσπασμα από τον Γκριγκόρι Όστερ:

Εάν δεν είστε σίγουροι ακόμα
Διαλέξαμε το μονοπάτι στη ζωή,
Και δεν ξέρεις γιατί
Ξεκινήστε το εργατικό σας ταξίδι,
Σπάστε τις λάμπες στους διαδρόμους -
Ο κόσμος θα σου πει «Ευχαριστώ».
Θα βοηθήσετε τον κόσμο
Εξοικονόμησε ρεύμα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο