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

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

Мен көлік жүргізуді үйреніп жүргенімде, бірінші сабақта нұсқаушы қиылысқа кері жүрді, содан кейін олай істеуге болмайды - ешқашан болмайды деді. Мен бұл ережені бірден және өмірімнің соңына дейін есіме алдым.

Сіз Григорий Остердің балаларға арналған «Жаман кеңесін» оқисыз және олардың бұлай етпеу керектігін қалай оңай және табиғи түрде түсінетінін көресіз.

Докер файлын қалай дұрыс жазу керектігі туралы көптеген мақалалар жазылған. Бірақ мен қате Docker-файлдарды жазу туралы нұсқауларды кездестірген жоқпын. Мен бұл олқылықтың орнын толтырамын. Мүмкін мен қолдау алатын жобаларда мұндай докер-файлдар аз болуы мүмкін.

Барлық кейіпкерлер, жағдайлар және 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 іске қосасыз. Содан кейін супервайзерді дәл осылай іске қосыңыз. Онда сіз жай ғана жолаушыны жүргізесіз.
С: Бірақ мен бір процесс болуы керек екенін оқыдым, сондықтан 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, әрине, одан да нашар болуы мүмкін, жетілдіруге шектеу жоқ. Бірақ бастапқыда бұл орындалады.

Мен Григорий Остердің сөзімен аяқтағым келеді:

Егер сіз әлі сенімді болмасаңыз
Біз өмір жолын таңдадық,
Ал сен неге екенін білмейсің
Еңбек жолыңызды бастаңыз,
Дәліздердегі шамдарды сындырыңыз -
Адамдар сізге «Рахмет» дейді.
Сіз халыққа көмектесесіз
Электр энергиясын үнемдеңіз.

Ақпарат көзі: www.habr.com

пікір қалдыру