Դոկեր. վատ խորհուրդ

Դոկեր. վատ խորհուրդ

Երբ ես սովորում էի մեքենա վարել, հենց առաջին դասին ուսուցիչը հետընթաց քայլեց խաչմերուկ, իսկ հետո ասաց, որ դա չպետք է անես, ընդհանրապես երբեք: Ես հիշեցի այս կանոնը անմիջապես և ամբողջ կյանքում:

Դուք կարդում եք Գրիգորի Օսթերի «Վատ խորհուրդները» երեխաներին և տեսնում եք, թե որքան հեշտ և բնական է նրանց գլխում, որ նրանք չպետք է դա անեն:

Շատ հոդվածներ են գրվել այն մասին, թե ինչպես ճիշտ գրել Dockerfile: Բայց ես չհանդիպեցի հրահանգների, թե ինչպես գրել սխալ Dockerfiles: Ես լրացնում եմ այս բացը: Եվ միգուցե այն նախագծերում, որոնք ես ստանում եմ աջակցություն, նման դոկերֆայլերը քիչ կլինեն։

Բոլոր կերպարները, իրավիճակները և Dockerfile-ը ֆիկտիվ են: Եթե ​​ճանաչում ես քեզ, կներես։

Dockerfile-ի ստեղծում՝ չարագուշակ և սարսափելի

Պիտեր (ավագ java/rubby/php ծրագրավորող). Գործընկեր Վասիլի, դուք արդեն բեռնե՞լ եք նոր մոդուլ Docker-ում:
Վասիլի (կրտսեր). Ոչ, ես ժամանակ չունեի, ես չեմ կարող դա պարզել այս Docker-ի հետ: Այնքան շատ հոդվածներ կան դրա վերաբերյալ, դա գլխապտույտ է առաջացնում:

Պետեր. Մեկ տարի առաջ մենք վերջնաժամկետ ունեինք: Թույլ տվեք օգնել ձեզ, մենք դա կհասկանանք ընթացքում: Ասա ինձ, ինչը քեզ մոտ չի ստացվում:

Վասիլի. Ես չեմ կարող ընտրել հիմնական պատկերը, որպեսզի այն լինի նվազագույն, բայց ունենա այն ամենը, ինչ ձեզ հարկավոր է:
Պետրոս. Վերցրեք ubuntu-ի պատկերը, այն ունի այն ամենը, ինչ ձեզ հարկավոր է: Իսկ այն, ինչ շատ ավելորդ բաներ են, հետո օգտակար կլինեն։ Եվ մի մոռացեք տեղադրել վերջին պիտակը, որպեսզի տարբերակը միշտ լինի ամենավերջինը:

Եվ առաջին տողը հայտնվում է Dockerfile-ում.

FROM ubuntu:latest

Պետրոս. Ի՞նչ է հաջորդը, ի՞նչ օգտագործեցինք մեր մոդուլը գրելու համար:
Վասիլի. Ուրեմն ռուբին, կա վեբ սերվեր և պետք է գործարկվեն մի քանի ծառայողական դեմոններ:
Պիտեր. Այո, մեզ ինչ է պետք. 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 (բայց ավելի շատ Ops, քան Dev), ներխուժում է գրասենյակ՝ գոռալով.

ԱԻ. Պետյա, քո մշակողները նորից կոտրեցին սննդի բազան, ե՞րբ կավարտվի...

Փոքր փոխհրաձգությունից հետո Իգոր Իվանովիչը սառչում է և սկսում պարզել, թե ինչ են անում այստեղ իր գործընկերները։

ԱԻ – Ի՞նչ ես անում:
Վասիլի. Պետրոսն օգնում է ինձ ստեղծել Dockerfile նոր մոդուլի համար:
AI: Թույլ տվեք նայել... Ի՞նչ եք գրել այստեղ, դուք մաքրում եք պահեստը առանձին հրամանով, սա լրացուցիչ շերտ է... Բայց ինչպես եք տեղադրում կախվածությունները, եթե չեք պատճենել Gemfile-ը: Եվ ընդհանրապես, սա լավ չէ:
Պիտեր. Խնդրում եմ, գնացեք ձեր գործին, մենք ինչ-որ կերպ կպարզենք:

Իգոր Իվանովիչը տխուր հառաչում է և հեռանում՝ պարզելու, թե ով է կոտրել տվյալների բազան։

Պետրոս. Այո, բայց նա ճիշտ էր ծածկագրի հարցում, մենք պետք է այն մտցնենք պատկերի մեջ: Եվ եկեք անմիջապես տեղադրենք ssh-ը և supervisor-ը, հակառակ դեպքում մենք կսկսենք դևերը:

Վասիլի. Հետո ես նախ պատճենելու եմ 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 սցենարը, որը կգործարկի ամեն ինչ: Լավ, այնպես որ դուք սկսեք ssh-ը, nohup-ով, որպեսզի մենք կարողանանք միանալ կոնտեյներին և տեսնել, թե ինչն է սխալվել: Այնուհետև նույն կերպ վարեք վերահսկիչ: Դե, ուրեմն դուք պարզապես վազում եք ուղևոր:
Հարց: Բայց ես կարդացի, որ պետք է լինի մեկ գործընթաց, այնպես որ Docker-ը կիմանա, որ ինչ-որ բան սխալ է տեղի ունեցել և կարող է վերագործարկել կոնտեյները:
Պ: Գլուխդ անհեթեթություններով մի՛ խանգարիր: Իսկ ընդհանրապես ինչպե՞ս։ Ինչպե՞ս եք այս ամենը վարում մեկ գործընթացում: Թող Իգոր Իվանովիչը մտածի կայունության մասին, իզուր չէ, որ նա աշխատավարձ է ստանում։ Մեր գործը կոդ գրելն է։ Իսկ ընդհանրապես, թող ասի շնորհակալություն, որ իր համար ենք գրել 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, որի տեսքը Իգոր Իվանովիչին կստիպի թողնել ծխելը, և նրա աչքերը կցավեն ևս մեկ շաբաթ։ Dockerfile-ը, իհարկե, կարող է ավելի վատ լինել, կատարելության սահման չկա: Բայց սկզբի համար սա կլինի:

Կցանկանայի ավարտել Գրիգորի Օստերի մեջբերումը.

Եթե ​​դեռ վստահ չեք
Մենք ընտրեցինք կյանքի ճանապարհը,
Եվ չգիտես ինչու
Սկսեք ձեր աշխատանքային ճանապարհորդությունը,
Կոտրեք լամպերը միջանցքներում -
Մարդիկ ձեզ կասեն «շնորհակալություն»:
Դուք կօգնեք ժողովրդին
Խնայել էլեկտրաէներգիան.

Source: www.habr.com

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