Докер: лош совет

Докер: лош совет

Кога учев да возам автомобил, на првата лекција инструкторот возеше во раскрсницата во рикверц, а потоа рече дека не треба да го правиш тоа - никогаш. Се сетив на ова правило веднаш и до крајот на мојот живот.

На децата им читате „Лоши совети“ од Григориј Остер и гледате колку лесно и природно им се чини дека не треба да го прават тоа.

Напишани се многу написи за тоа како правилно да се напише Dockerfile. Но, не наидов на упатства како да напишам неточни Dockerfiles. Ја пополнувам оваа празнина. А можеби во проектите што добивам поддршка ќе има помалку такви dockerfiles.

Сите ликови, ситуации и Dockerfile се фиктивни. Ако се препознаете, извинете.

Создавање Dockerfile, застрашувачко и страшно

Питер (постар развивач на java/rubby/php): Колега Василиј, дали веќе поставивте нов модул на Docker?
Василиј (помлад): Не, немав време, не можам да сфатам со овој Докер. Има толку многу написи за тоа, што е вртоглаво.

Петар: Имавме рок пред една година. Дозволете ми да ви помогнам, ние ќе го сфатиме тоа во процесот. Кажи ми што не ти оди.

Василиј: Не можам да изберам основна слика за да биде минимална, но има се што ви треба.
Петар: Земете ја сликата на Ubuntu, таа има се што ви треба. А она што е многу непотребни работи ќе ни се најде подоцна. И не заборавајте да ја ставите најновата ознака, така што верзијата е секогаш најнова.

И првата линија се појавува во Dockerfile:

FROM ubuntu:latest

Петар: Што е следно, што користевме за да го напишеме нашиот модул?
Василиј: Значи, рубин, има веб-сервер и треба да се лансираат неколку сервисни демони.
Петар: Да, што ни треба: рубин, пакет, нодејс, 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 за нов модул.
АИ: Дозволете ми да погледнам... Што напиша овде, го чистите складиштето со посебна команда, ова е дополнителен слој... Но, како да инсталирате зависности ако не сте ја копирале 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/* 

Петар: Па, што понатаму? Дали имате конфигурации за супервизор?
Василиј: Не, не. Но, ќе го направам тоа брзо.
Петар: Тогаш ќе го направиш тоа. Ајде сега да скицираме скрипта за иниција која ќе започне сè. Добро, па почнете ssh, со nohup, за да се поврземе со контејнерот и да видиме што тргнало наопаку. Потоа извршете го супервизорот на ист начин. Па, тогаш само трчате со патник.
П: Но, прочитав дека треба да има еден процес, па Докер ќе знае дека нешто тргна наопаку и може да го рестартира контејнерот.
П: Не замарајте ја главата со глупости. И воопшто, како? Како да го водите сето ова во еден процес? Нека размислува Игор Иванович за стабилност, не е за џабе што добива плата. Нашата работа е да пишуваме код. И воопшто нека каже фала што му го напишавме Dockfile.

10 минути и две видеа за мачки подоцна.

П: Направив сè. Додадов повеќе коментари.
П: Покажи ми!

Најновата верзија на 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”]

П: Одлично, ми се допаѓа. А коментарите се на руски, удобни и читливи, секој би работел така. Те научив на се, другото можеш да го направиш сам. Ајде да пиеме кафе...

Па, сега имаме перфектно ужасен Dockerfile, чиешто гледање ќе го натера Игор Иванович да посака да се откаже и очите ќе го болат уште една недела. Dockerfile, се разбира, може да биде уште полошо, нема ограничување до совршенство. Но, за почеток, ова ќе го направи.

Би сакал да завршам со цитат од Григориј Остер:

Ако сеуште не сте сигурни
Го избравме патот во животот,
И не знаеш зошто
Започнете го вашето породилно патување,
Скршете ги светилките во ходниците -
Луѓето ќе ви кажат „Благодарам“.
Ќе им помогнете на луѓето
Заштедете струја.

Извор: www.habr.com

Додадете коментар