Docker: mal consejo

Docker: mal consejo

Cuando estaba aprendiendo a conducir un automóvil, en la primera lección el instructor entró en la intersección dando marcha atrás y luego dijo que no debía hacer eso, nunca en absoluto. Recordé esta regla inmediatamente y por el resto de mi vida.

Si lees "Malos consejos" de Grigory Oster a los niños, ves con qué facilidad y naturalidad se dan cuenta de que no deberían hacer esto.

Se han escrito muchos artículos sobre cómo escribir un Dockerfile correctamente. Pero no encontré instrucciones sobre cómo escribir Dockerfiles incorrectos. Estoy llenando este vacío. Y tal vez en los proyectos en los que recibo apoyo, habrá menos archivos docker de este tipo.

Todos los personajes, situaciones y Dockerfile son ficticios. Si te reconoces, lo siento.

Creando un Dockerfile, siniestro y terrible

Peter (desarrollador senior de java/rubby/php): Colega Vasily, ¿ya ha subido un nuevo módulo a Docker?
Vasily (junior): No, no tuve tiempo, no puedo resolverlo con este Docker. Hay tantos artículos al respecto que es vertiginoso.

Peter: Teníamos una fecha límite hace un año. Déjame ayudarte, lo resolveremos en el proceso. Dime qué no te funciona.

Vasily: No puedo elegir una imagen básica para que sea mínima, pero tiene todo lo que necesitas.
Peter: Toma la imagen de ubuntu, tiene todo lo que necesitas. Y lo que es un montón de cosas innecesarias te vendrán bien más adelante. Y no olvides poner la etiqueta más reciente para que la versión sea siempre la más reciente.

Y la primera línea aparece en el Dockerfile:

FROM ubuntu:latest

Peter: ¿Qué sigue? ¿Qué usamos para escribir nuestro módulo?
Vasily: Ruby, hay un servidor web y se deberían iniciar un par de demonios de servicio.
Peter: Sí, qué necesitamos: Ruby, Bundler, Nodejs, Imagemagick y qué más... Y al mismo tiempo, hacer una actualización para obtener definitivamente nuevos paquetes.
Vasily: ¿Y no crearemos un usuario para no estar bajo la raíz?
Peter: A la mierda, entonces todavía tendrás que jugar con los derechos.
Vasily: Necesito tiempo, unos 15 minutos, para ponerlo todo junto en un solo comando, lo leí...
(Peter interrumpe bruscamente al meticuloso y muy inteligente joven.)
Peter: Escribe en comandos separados, será más fácil de leer.

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

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

AI: Petya, tus desarrolladores volvieron a romper la base de datos de alimentos, ¿cuándo terminará esto?

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

AI: ¿Qué estás haciendo?
Vasily: Peter me está ayudando a crear un Dockerfile para un nuevo módulo.
AI: Déjame echar un vistazo... ¿Qué escribiste aquí? Limpias el repositorio con un comando separado, esta es una capa adicional... ¡Pero cómo instalas dependencias si no has copiado el Gemfile! Y en general esto no es bueno.
Peter: Por favor, ocúpate de tus asuntos, lo resolveremos de alguna manera.

Igor Ivanovich suspira con tristeza y se va para descubrir quién rompió la base de datos.

Peter: Sí, pero tenía razón sobre el código: debemos insertarlo en la imagen. E instalemos inmediatamente ssh y supervisor; de lo contrario, iniciaremos los demonios.

Vasily: Primero copiaré Gemfile y Gemfile.lock, luego instalaré todo y luego copiaré todo el proyecto. Si el Gemfile no cambia, la capa se tomará del caché.
Peter: ¿Por qué están todos con estas capas? Copie todo de una vez. Copie de inmediato. La primera línea.

El Dockerfile ahora tiene este 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: Entonces, ¿qué sigue? ¿Tiene configuraciones para supervisor?
Vasily: No, no. Pero lo haré rápido.
Pedro: Entonces lo harás. Ahora esbocemos un script de inicio que iniciará todo. Bien, entonces inicias ssh, con nohup, para que podamos conectarnos al contenedor y ver qué salió mal. Luego ejecute supervisor de la misma manera. Bueno, entonces simplemente corre como pasajero.
P: Pero leí que debería haber un proceso, por lo que Docker sabrá que algo salió mal y podrá reiniciar el contenedor.
P: No te molestes en tonterías. Y en general ¿cómo? ¿Cómo se ejecuta todo esto en un solo proceso? Dejemos que Igor Ivanovich piense en la estabilidad, no en vano recibe un salario. Nuestro trabajo es escribir código. Y, en general, que le agradezca que escribimos el Dockefile para él.

10 minutos y dos vídeos sobre gatos después.

P: He hecho de todo. Agregué más comentarios.
P: ¡Muéstramelo!

Ú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: Genial, me gusta. Y los comentarios están en ruso, son cómodos y legibles, todos trabajarían así. Yo te enseñé todo, el resto lo puedes hacer tú mismo. Vamos a tomar un café...

Bueno, ahora tenemos un Dockerfile absolutamente terrible, cuya visión hará que Igor Ivanovich quiera dejar de fumar y le dolerán los ojos durante una semana más. El Dockerfile, por supuesto, podría ser incluso peor, no hay límite para la perfección. Pero para empezar, esto servirá.

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

Si aún no estás seguro
Elegimos el camino en la vida
Y no sabes por qué
Comienza tu viaje laboral,
Rompe las bombillas de los pasillos -
La gente te dirá "gracias".
Ayudaras a la gente
Ahorrar electricidad.

Fuente: habr.com

Añadir un comentario