Docker: pis məsləhət

Docker: pis məsləhət

Mən maşın sürməyi öyrənəndə, elə ilk dərsdə təlimatçı kəsişməyə tərs istiqamətdə getdi və sonra dedi ki, bunu etməməlisən - heç vaxt. Bu qaydanı dərhal və ömrümün sonuna qədər xatırladım.

Siz uşaqlara Qriqori Osterin “Pis nəsihət” əsərini oxuyursunuz və görürsünüz ki, onlara bunu etməmək necə asan və təbiidir.

Dockerfile-ni necə düzgün yazmaq barədə çoxlu məqalələr yazılmışdır. Ancaq səhv Dockerfiles yazmaq barədə təlimatlara rast gəlmədim. Mən bu boşluğu doldururam. Və bəlkə də dəstək aldığım layihələrdə belə doker faylları daha az olacaq.

Bütün personajlar, vəziyyətlər və Dockerfile uydurmadır. Özünü tanısan, bağışla.

Dockerfile yaratmaq, bədbəxt və dəhşətli

Peter (Baş java/rubby/php tərtibatçısı): Həmkar Vasili, siz artıq Docker-ə yeni modul yükləmisiniz?
Vasili (kiçik): Xeyr, vaxtım yox idi, mən bunu bu Docker ilə başa düşə bilmirəm. Bu haqda o qədər məqalə var ki, baş gicəlləndirir.

Peter: Bir il əvvəl son tariximiz var idi. İcazə verin sizə kömək edim, biz bunu prosesdə anlayacağıq. Sizə nəyin uyğun olmadığını deyin.

Vasili: Əsas şəkil seçə bilmirəm ki, o, minimal olsun, amma sizə lazım olan hər şey var.
Peter: Ubuntu şəklini götürün, onda sizə lazım olan hər şey var. Və bir çox lazımsız şeylər daha sonra lazımlı olacaq. Ən son etiketi qoymağı unutmayın ki, versiya həmişə ən yeni olsun.

Və ilk sətir Dockerfile-də görünür:

FROM ubuntu:latest

Peter: Sonra nə var, modulumuzu yazmaq üçün nədən istifadə etdik?
Vasili: Beləliklə, Ruby, bir veb server var və bir neçə xidmət demonu işə salınmalıdır.
Peter: Bəli, bizə nə lazımdır: ruby, bundler, nodejs, imagemagick və daha nələr... Və eyni zamanda, mütləq yeni paketlər əldə etmək üçün təkmilləşdirmə aparın.
Vasili: Bəs biz istifadəçi yaratmayacağıq ki, kök altında qalmayaq?
Peter: Sikdirin, onda siz hələ də hüquqlarla aldatmalısınız.
Vasili: Mənə vaxt lazımdır, təxminən 15 dəqiqə, hamısını bir əmrdə birləşdirmək üçün oxudum ki...
(Peter kobud şəkildə vasvası və çox ağıllı gəncin sözünü kəsir.)
Peter: Ayrı-ayrı əmrlərlə yazın, oxumaq daha asan olacaq.

Dockerfile böyüyür:

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

Sonra İqor İvanoviç, DevOps (lakin Devdən daha çox Ops), ofisə qışqıraraq:

AI: Petya, sizin tərtibatçılarınız yenidən qida məlumat bazasını sındırdılar, bu nə vaxt bitəcək...

Kiçik atışmadan sonra İqor İvanoviç soyuyur və həmkarlarının burada nə işlə məşğul olduğunu öyrənməyə başlayır.

AI: Nə edirsən?
Vasili: Peter mənə yeni modul üçün Dockerfile yaratmağa kömək edir.
A.İ.: İcazə verin bir nəzər salım... Burda nə yazmısınız, ayrıca əmrlə deponu təmizləyirsiniz, bu əlavə qatdır... Amma Gemfile-ni kopyalamamısınızsa, asılılıqları necə quraşdırırsınız! Və ümumiyyətlə, bu yaxşı deyil.
Peter: Zəhmət olmasa, işinizlə məşğul olun, biz bunu birtəhər anlayacağıq.

İqor İvanoviç kədərlə ah çəkir və məlumat bazasını kimin sındırdığını anlamaq üçün ayrılır.

Peter: Bəli, amma kod haqqında o, haqlı idi, biz onu görüntüyə daxil etməliyik. Gəlin dərhal ssh və supervisor quraşdıraq, əks halda demonları işə salacağıq.

Vasili: Onda əvvəlcə Gemfile və Gemfile.lock-u kopyalayacağam, sonra hər şeyi quraşdıracağam, sonra isə bütün layihəni kopyalayacağam. Gemfile dəyişməzsə, təbəqə keşdən götürüləcək.
Peter: Niyə hamınız bu təbəqələrdəsiniz, hər şeyi birdən kopyalayın. Dərhal kopyalayın. Ən birinci xətt.

Dockerfile indi belə görünür:

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: Sonra nə olacaq? Nəzarətçi üçün konfiqurasiyalarınız varmı?
Vasili: Yox, yox. Amma tez edəcəm.
Peter: Onda bunu edəcəksən. İndi hər şeyi işə salacaq init skriptini tərtib edək. Yaxşı, nohup ilə ssh-ni işə salın ki, konteynerə qoşulub nəyin səhv olduğunu görə bilək. Sonra nəzarətçini eyni şəkildə idarə edin. Yaxşı, o zaman sadəcə sərnişin idarə edirsən.
S: Amma oxudum ki, bir proses olmalıdır, ona görə də Docker nəyinsə səhv getdiyini biləcək və konteyneri yenidən işə sala bilər.
P: Cəfəngiyatla başınızı yormayın. Və ümumiyyətlə, necə? Bütün bunları bir prosesdə necə idarə edirsiniz? İqor İvanoviç sabitlik haqqında düşünsün, maaş alması boş yerə deyil. Bizim işimiz kod yazmaqdır. Və ümumiyyətlə, sağ olsun desin ki, biz onun üçün Dockfile yazdıq.

10 dəqiqə və sonra pişiklər haqqında iki video.

S: Mən hər şeyi etmişəm. Daha çox şərh əlavə etdim.
P: Mənə göstər!

Dockerfile-in son versiyası:

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: Əla, bəyəndim. Şərhlər isə rus dilindədir, rahat və oxunaqlıdır, hamı belə işləyəcək. Mən sənə hər şeyi öyrətmişəm, qalanını özün edə bilərsən. Gedək bir qəhvə içək...

Yaxşı, indi bizdə mükəmməl bir dəhşətli Dockerfile var, onun görünüşü İqor İvanoviçin işdən çıxmaq istəyinə səbəb olacaq və gözləri daha bir həftə ağrıyacaq. Dockerfile, əlbəttə ki, daha da pis ola bilər, mükəmməlliyə heç bir məhdudiyyət yoxdur. Ancaq başlanğıc üçün bu kömək edəcəkdir.

Qriqori Osterdən bir sitatla bitirmək istərdim:

Hələ əmin deyilsinizsə
Həyatda yol seçdik,
Və niyə bilmirsən
Əmək səyahətinizə başlayın,
Koridorlardakı lampaları sındırın -
İnsanlar sizə "sağ ol" deyəcəklər.
Xalqa kömək edəcəksən
Elektrik enerjisinə qənaət edin.

Mənbə: www.habr.com

Добавить комментарий