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