Docker: mal consello

Docker: mal consello

Cando estaba aprendendo a conducir un coche, na primeira lección o instrutor dirixiuse á intersección ao revés e despois dixo que non deberías facelo, nunca. Lembreime desta regra inmediatamente e durante o resto da miña vida.

Le "Bad Advice" de Grigory Oster aos nenos, e ves con que facilidade e naturalidade lles entende que non deberían facelo.

Escribíronse moitos artigos sobre como escribir correctamente un Dockerfile. Pero non atopei instrucións sobre como escribir Dockerfiles incorrectos. Estou enchendo este oco. E quizais nos proxectos que recibo apoio, haxa menos dockerfiles deste tipo.

Todos os personaxes, situacións e Dockerfile son ficticios. Se te recoñeces, desculpa.

Creando un Dockerfile, ominoso e terrible

Peter (Desenvolvedor senior de java/rubby/php): compañeiro Vasily, xa cargaches un novo módulo a Docker?
Vasily (xuvenil): Non, non tiven tempo, non o podo entender con este Docker. Hai tantos artigos sobre el, é vertixinoso.

Peter: Tiñamos unha data límite hai un ano. Permíteme axudarche, resolverémolo no proceso. Dime o que non che funciona.

Vasily: Non podo escoller unha imaxe básica para que sexa mínima, pero ten todo o que necesitas.
Peter: Toma a imaxe de ubuntu, ten todo o que necesitas. E o que son moitas cousas innecesarias virá útil máis tarde. E non esquezas poñer a etiqueta máis recente para que a versión sexa sempre a máis recente.

E a primeira liña aparece no Dockerfile:

FROM ubuntu:latest

Peter: Que segue, que utilizamos para escribir o noso módulo?
Vasily: Entón, Ruby, hai un servidor web e deberían lanzarse un par de daemons de servizo.
Peter: Si, que necesitamos: ruby, bundler, nodejs, imagemagick e que máis... E ao mesmo tempo, fai unha actualización para conseguir novos paquetes definitivamente.
Vasily: E non imos crear un usuario para non estar baixo root?
Peter: Joder, entón aínda tes que andar cos dereitos.
Vasily: Necesito tempo, uns 15 minutos, para xuntar todo nun só comando, lin iso...
(Pedro interrompe rudamente ao meticuloso e moi intelixente junior.)
Pedro: Escribe en ordes separadas, será máis fácil de ler.

Dockerfile crece:

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

Entón Igor Ivanovich, DevOps (pero máis Ops que Dev), irrompe na oficina gritando:

AI: Petya, os teus desenvolvedores romperon a base de datos de alimentos de novo, cando acabará isto...

Despois dunha pequena escaramuza, Igor Ivanovich arrefría e comeza a descubrir o que están a facer os seus compañeiros aquí.

AI: Que fas?
Vasily: Peter está a axudarme a crear un Dockerfile para un novo módulo.
AI: Déixame botarlle unha ollada... Que escribiches aquí, limpas o repositorio cun comando separado, esta é unha capa adicional... Pero como instalas dependencias se non copiaches o Gemfile! E, en xeral, isto non é bo.
Peter: Fai o teu negocio, resolverémolo dalgún xeito.

Igor Ivanovich suspira tristemente e sae para descubrir quen rompeu a base de datos.

Peter: Si, pero tiña razón sobre o código, necesitamos introducilo na imaxe. E imos instalar inmediatamente ssh e supervisor, se non, iniciaremos os daemons.

Vasily: Entón primeiro copiarei o Gemfile e Gemfile.lock, despois instalarei todo e despois copiarei todo o proxecto. Se o Gemfile non cambia, a capa será eliminada da caché.
Peter: Por que estás todos con estas capas, copia todo á vez. Copia de inmediato. A primeira liña.

O Dockerfile agora ten o seguinte aspecto:

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

Pedro: Entón, que segue? Tes configuración para o supervisor?
Vasily: Non, non. Pero fareino axiña.
Pedro: Entón farao. Imos agora esbozar un script de inicio que lanzará todo. Está ben, entón inicias ssh, con nohup, para que poidamos conectarnos ao contedor e ver que pasou mal. A continuación, executa o supervisor do mesmo xeito. Ben, entón só corres pasaxeiro.
P: Pero lin que debería haber un proceso, polo que Docker saberá que algo saíu mal e pode reiniciar o contedor.
P: Non te molestes a cabeza con tonterías. E en xeral, como? Como executas todo isto nun só proceso? Deixa que Igor Ivanovich pense na estabilidade, non é por nada que recibe un salario. O noso traballo é escribir código. E, en xeral, que diga as grazas por escribir o Dockefile para el.

10 minutos e dous vídeos sobre gatos despois.

P: Eu fixen de todo. Engadín máis comentarios.
P: Amósame!

Última versión de 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: Xenial, gústame. E os comentarios están en ruso, cómodos e lexibles, todos funcionarían así. Ensineino todo, o resto podedes facer vostede mesmo. Imos tomar un café...

Ben, agora temos un Dockerfile perfectamente terrible, cuxa visión fará que Igor Ivanovich queira saír e lle doen os ollos unha semana máis. O Dockerfile, por suposto, podería ser aínda peor, non hai límite para a perfección. Pero para comezar, isto servirá.

Gustaríame rematar cunha cita de Grigory Oster:

Se aínda non estás seguro
Escollemos o camiño da vida,
E non sabes por que
Comeza a túa viaxe laboral,
Rompe as lámpadas nos corredores -
A xente diráche "Grazas".
Axudarás á xente
Aforra electricidade.

Fonte: www.habr.com

Engadir un comentario