Докер: жаман кеңеш

Докер: жаман кеңеш

Мен машина айдаганды үйрөнүп жатканда, биринчи сабакта эле инструктор кесилишине тескери айдап кирди, анан мындай кылба, такыр болбойт деди. Мен бул эрежени дароо жана өмүрүмдүн аягына чейин эстедим.

Сиз Григорий Остердин балдарга “Жаман кеңешин” окуйсуз, жана алардын мындай кылбашы керектиги канчалык оңой жана табигый түрдө пайда болуп жатканын көрөсүз.

Докер файлын кантип туура жазуу керектиги жөнүндө көптөгөн макалалар жазылган. Бирок мен туура эмес Dockerfiles жазуу боюнча нускамаларды көргөн жокмун. Мен бул боштукту толтуруп жатам. Балким, мен колдогон долбоорлордо мындай докер-файлдар азыраак болот.

Бардык каармандар, кырдаалдар жана Dockerfile ойдон чыгарылган. Өзүңдү таанысаң кечир.

Dockerfile түзүү, коркунучтуу жана коркунучтуу

Питер (Java/rubby/php улук иштеп чыгуучусу): Кесиптеш Василий, сиз Dockerге жаңы модулду жүктөдүңүз беле?
Василий (кенже): Жок, менин убактым болгон жок, мен муну Докер менен түшүнө албайм. Бул жөнүндө көптөгөн макалалар бар, баш айлантат.

Петир: Бизде бир жыл мурун мөөнөт бар болчу. Мен сага жардам берейин, биз муну процессте чечебиз. Сизге эмне иштебей турганын айтыңыз.

Василий: Мен негизги сүрөттү тандай албайм, ал минималдуу, бирок сизге керектүү нерселердин баары бар.
Петир: Ubuntu сүрөтүн алыңыз, анда сизге керектүү нерселердин баары бар. Ал эми көп керексиз нерселер кийинчерээк пайдалуу болот. Жана версия дайыма эң акыркы болушу үчүн эң акыркы тэгди коюуну унутпаңыз.

Жана биринчи сап Dockerfileде пайда болот:

FROM ubuntu:latest

Петир: Эми эмне болот, модулубузду жазуу үчүн эмнени колдондук?
Василий: Ошентип, ruby, веб-сервер бар жана бир нече сервис демондорун ишке киргизүү керек.
Петир: Ооба, бизге эмне керек: ruby, bundler, nodejs, imagemagick жана дагы эмнелер... Жана ошол эле учурда жаңы пакеттерди сөзсүз алуу үчүн жаңыртыңыз.
Василий: А биз түп-тамыры менен калбаш үчүн колдонуучуну түзбөйбүзбү?
Петир: Блять, анда сен дагы эле укуктар менен алдашың керек.
Василий: Мага 15 мүнөттөй убакыт керек, мунун баарын бир командага топтош үчүн, мен муну окудум...
(Питер кылдат жана өтө акылдуу кенже баланын сөзүн орой түрдө бөлүп салат.)
Петир: Өзүнчө буйруктар менен жаз, окуу оңой болот.

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

Ошондо Игорь Иванович, DevOps (бирок Девге караганда Оп көп), кеңсеге кыйкырып кирди:

AI: Петя, сиздин иштеп чыгуучуларыңыз тамак-аш базасын кайрадан бузуп салышты, бул качан бүтөт...

Кичинекей кагылышуудан кийин Игорь Иванович муздап, кесиптештери бул жерде эмне кылып жатышканын биле баштайт.

А.И.: Эмне кылып жатасың?
Василий: Питер мага жаңы модул үчүн Dockerfile түзүүгө жардам берип жатат.
AI: Мен карап көрөйүн ... Бул жерде эмне жаздыңыз, сиз репозиторийди өзүнчө буйрук менен тазалайсыз, бул кошумча катмар... Бирок Gemfile көчүрө элек болсоңуз, көз карандылыкты кантип орнотосуз! Жана жалпысынан алганда, бул жакшы эмес.
Питер: Сураныч, өз ишиң менен алектен, биз муну кандайдыр бир жол менен чечебиз.

Игорь Иванович өкүнүчтүү үшкүрүнүп, базаны ким бузганын билүү үчүн кетет.

Петир: Ооба, бирок ал код жөнүндө туура айтты, биз аны образга түртүшүбүз керек. Келгиле, дароо ssh жана супервайзерди орнотобуз, антпесе демондорду баштайбыз.

Василий: Анан мен алгач Gemfile жана Gemfile.lock файлдарын көчүрөм, анан баарын орнотом, анан бүт долбоорду көчүрөм. Gemfile өзгөрбөсө, катмар кэштен алынат.
Петир: Эмне үчүн баарыңар ушул катмарлар менен жүрсүңөр, баарын бир эле учурда көчүрүп алгыла. Ошол замат көчүрүңүз. Эң биринчи линия.

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

Петир: Анан эмне болот? Сизде супервайзер үчүн конфигурациялар барбы?
Василий: Жок, жок. Бирок мен муну тез эле жасайм.
Петир: Анда сен кыласың. Эми баарын ишке киргизе турган init скриптинин эскизин жасайлы. Макул, контейнерге туташып, эмне ката кеткенин көрүү үчүн nohup менен ssh'ти баштайсыз. Анан ошол эле жол менен супервайзерди иштетиңиз. Анда сиз жөн гана жүргүнчү айдайсыз.
С: Бирок мен бир процесс болушу керек деп окудум, ошондуктан Докер бир жерден ката кеткенин билип, контейнерди кайра иштете алат.
П: Болуптур, башыңды кыйнаба. Жана жалпысынан, кантип? Мунун баарын бир процессте кантип иштетесиз? Игорь Иванович стабилдүүлүк жөнүндө ойлонсун, ал бекеринен айлык алган эмес. Биздин иш код жазуу болуп саналат. Ал эми жалпысынан, биз ага Dockfile жазганыбыз үчүн рахмат айтсын.

10 мүнөттөн кийин мышыктар тууралуу эки видео.

С: Мен баарын жасадым. Мен дагы комментарийлерди коштум.
P: Мага көрсөт!

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: Жакшы, мага жагат. Ал эми комментарийлер орусча, ынгайлуу жана окумдуу, баары ушинтип иштемек. Мен сага баарын үйрөттүм, калганын өзүң кыла аласың. Барып кофе ичели...

Эми бизде эң коркунучтуу Докерфайл бар, анын көрүнүшү Игорь Ивановичтин жумуштан кеткиси келип, көздөрү дагы бир жумага ооруйт. Dockerfile, албетте, андан да жаман болушу мүмкүн, кемчиликсиздиктин чеги жок. Бирок, биринчиден, бул ишке ашат.

Мен Григорий Остерден цитата менен аяктагым келет:

Эгер сиз азырынча так эмес болсоңуз
Жашоодо жол тандадык,
А сен эмнеге экенин билбейсиң
Эмгек жолуңду башта,
Коридордогу лампаларды сындырыңыз -
Эл сага "рахмат" дешет.
Элге жардам бересиң
Электр энергиясын үнөмдөө.

Source: www.habr.com

Комментарий кошуу