Docker: malos consejos


Cuando aprendí a conducir un automóvil, en la primera lección, el instructor fue a la intersección en reversa y luego dijo que no debería hacerlo, nunca. Esta regla la recordé de inmediato y de por vida.


Lees los "malos consejos" a los niños de Grigory Oster, y ves cuán fácil y naturalmente se les ocurre que esto no se puede hacer.


Se han escrito muchos artículos sobre cómo escribir Dockerfile correctamente. Pero no encontré instrucciones sobre cómo escribir el Dockerfile incorrecto. Lleno este vacío Y tal vez en los proyectos que obtenga apoyo, habrá menos dockerfiles.


Todos los héroes, situaciones y dockerfile son ficticios. Si te reconoces, lo siento.


Crea un Dockerfile, siniestro y terrible


Peter (desarrollador senior de java / ruby ​​/ php): Colega Vasily, ¿ya has subido un nuevo módulo a Docker?
Albahaca (junior): No, no lo hice, no puedo resolverlo con este Docker. Tantos artículos sobre él, mis ojos se abren de par en par.


Peter: Tenemos una fecha límite hace un año. Ayudemos, lo resolveremos en el proceso. Dime qué no puedes hacer allí.


Albahaca: no puedo elegir la imagen básica para que sea mínima, pero había todo lo que se necesitaba.
Peter: Toma la imagen de ubuntu, tiene todo lo que necesitas. Y qué exceso, entonces será útil. Y no olvide poner la última etiqueta para que la versión sea siempre la última.


Y en el Dockerfile, aparece la primera línea:


FROM ubuntu:latest 

Peter: ¿Qué sigue, en qué escribimos nuestro módulo?
Albahaca: Entonces Ruby, debería comenzar un servidor web y un par de demonios de servicio.
Peter: Sí, qué necesitamos: ruby, bundler, nodejs, imagemagick y qué más ... Y al mismo tiempo, actualiza para obtener nuevos paquetes con seguridad.
Albahaca: ¿Y no crearemos el usuario, para que no sea desde la raíz?
Peter: Oh, bueno él, entonces aún tonto con los derechos.
Vasily: Necesito tiempo, unos 15 minutos, para hacerlo todo en un equipo, leí que ...
(Peter interrumpe groseramente el junio meticuloso y muy inteligente.)
Peter: Escribe en equipos separados, y será más fácil de leer.


Dockerfile está creciendo:


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

Entonces Igor Ivanovich irrumpió en la oficina, DevOps (pero más Ops que Dev), gritando:


AI: Petya, tus desarrolladores volvieron a romper la base de datos de productos, ¿cuándo termina ...?


Después de una pequeña escaramuza, Igor Ivanovich se enfría y comienza a descubrir qué están haciendo sus colegas aquí.


AI: ¿Qué haces?
Albahaca: Peter me ayuda a compilar un Dockerfile para un nuevo módulo.
II: Echemos un vistazo ... ¿Qué has escrito aquí? Limpia el repositorio con un comando separado, esta es una capa adicional ... Pero, ¿cómo colocar las dependencias si no copiaste el Gemfile! Y de todos modos, esto no es bueno.
Peter: Por favor, sigue con tu negocio, lo resolveremos de alguna manera.


Igor Ivanovich suspira tristemente y se va para averiguar quién ha roto la base de datos.


Peter: Sí, pero sobre el código, dijo lo correcto, debes introducirlo en la imagen. Y pongamos ssh y supervisor de inmediato, de lo contrario comenzaremos los demonios.


Vasily: Primero copio Gemfile y Gemfile.lock, luego pongo todo y luego copio todo el proyecto. Si el Gemfile no cambia, la capa se tomará del caché.
Peter: ¿Qué sois con estas capas? Copia todo de una vez. Copia de inmediato. La primera linea.


Dockerfile ahora se ve así:


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

Peter: Entonces, ¿qué sigue? ¿Tienes configuraciones para supervisor?
Albahaca: No, no. Pero lo haré rápido.
Peter: Entonces hazlo. Ahora esbocemos el guión de inicio que ejecutará todo. Entonces, con eso, comienzas ssh con nohup para que podamos conectarnos al contenedor y ver qué salió mal. Entonces también lanzar supervisor. Bueno, entonces solo corre pasajero.
P: Pero leí que debería haber un proceso, por lo que Docker sabrá que algo salió mal y puede reiniciar el contenedor.
P: No te molestes con tu cabeza. Y en general, ¿cómo? ¿Cómo lo ejecutas todo en un solo proceso? Que Igor Ivanovich piense en la estabilidad, no en vano, que recibe un salario. Nuestro negocio es escribir código. Y de todos modos, que le diga gracias por escribir el Dockefile para él.


Después de 10 minutos y dos videos sobre gatos.


P: hice todo. También agregué comentarios.
P: Show!


Versión nueva 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: Genial, me gusta. Y los comentarios en ruso son convenientes y legibles, todos trabajarían así. Te enseñé todo, luego puedes hacerlo tú mismo. Vamos a tomar café ...


Bueno, aquí tenemos un Dockerfile absolutamente terrible, por lo que Igor Ivanovich quiere dejar y sus ojos sufrirán por otra semana. Dockerfile, por supuesto, podría ser aún peor, no hay límite para la perfección. Pero para empezar, lo hará.


Me gustaría terminar con una cita de Gregory Oster:


Si aún no estás firme
Han elegido el camino
Y no sabes por qué
Trabaja tu camino para comenzar,
Batir las luces en los porches -
La gente dirá gracias.
Ayudarás a la gente
Protege la electricidad.


UPD : En los comentarios preguntan qué hay de malo en estos Dockerfiles. El otro día escribiré un artículo separado con un análisis de errores.

Source: https://habr.com/ru/post/449944/


All Articles