Docker: yomon maslahat

Docker: yomon maslahat

Men mashina haydashni o'rganayotganimda, birinchi darsda o'qituvchi chorrahaga teskari yo'nalishda kirib ketdi va keyin buni qilmaslik kerakligini aytdi - hech qachon. Men bu qoidani darhol va butun umrim davomida esladim.

Siz bolalarga Grigoriy Osterning "Yomon maslahat" asarini o'qiysiz va ular buni qilmasliklari qanchalik oson va tabiiy ravishda paydo bo'lishini ko'rasiz.

Dockerfile-ni qanday qilib to'g'ri yozish haqida ko'plab maqolalar yozilgan. Lekin men noto'g'ri Dockerfiles yozish bo'yicha ko'rsatmalarga duch kelmadim. Men bu bo'shliqni to'ldiraman. Va, ehtimol, men qo'llab-quvvatlaydigan loyihalarda bunday docker fayllari kamroq bo'ladi.

Barcha belgilar, vaziyatlar va Dockerfile xayoliydir. Agar o'zingizni tanisangiz, kechirasiz.

Dockerfile yaratish, dahshatli va dahshatli

Piter (katta java/rubby/php dasturchisi): Vasiliy hamkasb, siz allaqachon Docker-ga yangi modul yuklaganmisiz?
Vasiliy (kichik): Yo'q, menda vaqt yo'q edi, men buni Docker bilan aniqlay olmayman. Bu haqda juda ko'p maqolalar bor, bu bosh aylanadi.

Piter: Bizda bir yil oldin muddat bor edi. Sizga yordam beray, biz buni jarayonda aniqlaymiz. Sizga nima ishlamasligini ayting.

Vasiliy: Men asosiy tasvirni tanlay olmayman, shunda u minimal, lekin sizga kerak bo'lgan hamma narsa bor.
Piter: Ubuntu tasvirini oling, unda sizga kerak bo'lgan hamma narsa bor. Va juda ko'p keraksiz narsalar keyinchalik foydali bo'ladi. Va versiya har doim eng yangi bo'lishi uchun eng so'nggi tegni qo'yishni unutmang.

Va birinchi qator Dockerfileda paydo bo'ladi:

FROM ubuntu:latest

Piter: Keyin nima bo'ladi, biz modulimizni yozish uchun nimadan foydalandik?
Vasiliy: Demak, ruby, veb-server bor va bir nechta xizmat demonlarini ishga tushirish kerak.
Piter: Ha, bizga nima kerak: ruby, bundler, nodejs, imagemagick va yana nima... Shu bilan birga, albatta yangi paketlarni olish uchun yangilanishni bajaring.
Vasiliy: Biz ildiz ostida qolmasligimiz uchun foydalanuvchi yaratmaymizmi?
Piter: Jin bo'lsin, keyin siz hali ham huquqlar bilan aldashingiz kerak.
Vasiliy: Hammasini bitta buyruqqa jamlash uchun menga vaqt kerak, taxminan 15 daqiqa, men buni o'qidim ...
(Piter qo'pol va juda aqlli o'quvchining gapini to'xtatadi.)
Butrus: Alohida buyruqlar bilan yozing, o'qish osonroq bo'ladi.

Dockerfile o'sadi:

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

Keyin Igor Ivanovich, DevOps (lekin Devdan ko'ra ko'proq Ops) ofisga baqirdi:

AI: Petya, sizning ishlab chiquvchilaringiz yana oziq-ovqat ma'lumotlar bazasini buzishdi, bu qachon tugaydi ...

Kichkina to'qnashuvdan so'ng Igor Ivanovich soviydi va hamkasblari bu erda nima qilishayotganini bila boshlaydi.

AI: Nima qilyapsan?
Vasiliy: Piter menga yangi modul uchun Dockerfile yaratishda yordam bermoqda.
AI: Keling, bir ko'rib chiqaman ... Siz bu erda nima yozdingiz, siz alohida buyruq bilan omborni tozalaysiz, bu qo'shimcha qatlam ... Lekin agar siz Gemfayldan nusxa ko'chirmagan bo'lsangiz, qanday qilib bog'liqliklarni o'rnatasiz! Va umuman olganda, bu yaxshi emas.
Piter: Iltimos, o'z ishingiz bilan shug'ullaning, biz buni qandaydir tarzda hal qilamiz.

Igor Ivanovich g'amgin xo'rsinadi va ma'lumotlar bazasini kim buzganini aniqlash uchun ketadi.

Piter: Ha, lekin u kod haqida to'g'ri edi, biz uni tasvirga kiritishimiz kerak. Va darhol ssh va supervayzerni o'rnatamiz, aks holda biz demonlarni ishga tushiramiz.

Vasiliy: Keyin men birinchi navbatda Gemfile va Gemfile.lock-dan nusxa ko'chiraman, keyin hamma narsani o'rnataman, keyin esa butun loyihani nusxalayman. Agar Gemfile o'zgarmasa, qatlam keshdan olinadi.
Piter: Nega hammangiz bu qatlamlardasiz, hamma narsani birdan nusxa ko'chiring. Darhol nusxa ko'chiring. Eng birinchi qator.

Dockerfile endi shunday ko'rinadi:

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

Butrus: Xo'sh, keyin nima? Nazoratchi uchun konfiguratsiyalaringiz bormi?
Vasiliy: Yo'q, yo'q. Lekin men buni tezda bajaraman.
Butrus: Keyin buni qilasiz. Keling, hamma narsani ishga tushiradigan init skriptini chizamiz. OK, siz nohup bilan ssh-ni ishga tushirasiz, shunda biz konteynerga ulanishimiz va nima noto'g'ri ekanligini ko'rishimiz mumkin. Keyin supervayzerni xuddi shu tarzda boshqaring. Xo'sh, siz shunchaki yo'lovchini boshqarasiz.
Savol: Lekin men bitta jarayon bo'lishi kerakligini o'qidim, shuning uchun Docker nimadir noto'g'ri ketganini bilib oladi va konteynerni qayta ishga tushirishi mumkin.
P: Boshingizni bema'ni gaplar bilan bezovta qilmang. Va umuman, qanday qilib? Bularning barchasini bitta jarayonda qanday bajarasiz? Igor Ivanovich barqarorlik haqida o'ylasin, u maosh olishi bejiz emas. Bizning vazifamiz kod yozishdir. Va umuman olganda, biz unga Dockfile-ni yozganimiz uchun rahmat aytsin.

10 daqiqa va keyin mushuklar haqida ikkita video.

Savol: Men hamma narsani qildim. Men ko'proq sharhlar qo'shdim.
P: Menga ko'rsating!

Dockerfile-ning so'nggi versiyasi:

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: Ajoyib, menga yoqadi. Va sharhlar rus tilida, qulay va o'qilishi mumkin, hamma shunday ishlaydi. Men sizga hamma narsani o'rgatganman, qolganini o'zingiz qilishingiz mumkin. Qani, kofe ichaylik...

Xo'sh, endi bizda juda dahshatli Dockerfile bor, uni ko'rish Igor Ivanovichni ishdan bo'shatishni xohlaydi va uning ko'zlari yana bir hafta og'riydi. Dockerfile, albatta, bundan ham battar bo'lishi mumkin, mukammallikka cheklov yo'q. Lekin birinchi navbatda, bu amalga oshadi.

Men Grigoriy Osterdan iqtibos bilan yakunlamoqchiman:

Agar hali ishonchingiz komil bo'lmasa
Biz hayot yo'lini tanladik,
Va nima uchunligini bilmaysiz
Mehnat sayohatingizni boshlang,
Koridorda lampochkalarni sindirish -
Odamlar sizga "rahmat" deyishadi.
Siz odamlarga yordam berasiz
Elektr energiyasini tejang.

Manba: www.habr.com

a Izoh qo'shish