Docker : mauvais conseil

Docker : mauvais conseil

Lorsque j'apprenais à conduire une voiture, dès la première leçon, l'instructeur a conduit à l'intersection en marche arrière, puis m'a dit que vous ne devriez pas faire cela - jamais du tout. Je me suis souvenu de cette règle immédiatement et pour le reste de ma vie.

Vous lisez « Mauvais conseils » de Grigory Oster aux enfants et vous voyez avec quelle facilité et nature ils se rendent compte qu'ils ne devraient pas faire cela.

De nombreux articles ont été écrits sur la façon d'écrire correctement un Dockerfile. Mais je n'ai trouvé aucune instruction sur la façon d'écrire des Dockerfiles incorrects. Je comble cette lacune. Et peut-être que dans les projets pour lesquels je reçois du soutien, il y aura moins de fichiers docker de ce type.

Tous les personnages, situations et Dockerfile sont fictifs. Si vous vous reconnaissez, désolé.

Créer un Dockerfile, inquiétant et terrible

Peter (développeur senior java/rubby/php) : Cher collègue Vasily, avez-vous déjà téléchargé un nouveau module sur Docker ?
Vasily (junior) : Non, je n'ai pas eu le temps, je n'arrive pas à comprendre avec ce Docker. Il y a tellement d’articles là-dessus, c’est vertigineux.

Peter : Nous avions une date limite il y a un an. Laissez-moi vous aider, nous trouverons une solution au fur et à mesure. Dis-moi ce qui ne marche pas pour toi.

Vasily : Je ne peux pas choisir une image de base pour qu'elle soit minimale, mais qu'elle contienne tout ce dont vous avez besoin.
Peter : Prenez l'image Ubuntu, elle contient tout ce dont vous avez besoin. Et ce qui représente beaucoup de choses inutiles sera utile plus tard. Et n’oubliez pas de mettre la dernière balise pour que la version soit toujours la plus récente.

Et la première ligne apparaît dans le Dockerfile :

FROM ubuntu:latest

Peter : Quelle est la prochaine étape ? Qu'avons-nous utilisé pour écrire notre module ?
Vasily : Donc Ruby, il y a un serveur Web et quelques démons de service devraient être lancés.
Peter : Ouais, de quoi avons-nous besoin : Ruby, Bundler, Nodejs, imagemagick et quoi d'autre... Et en même temps, faites une mise à niveau pour obtenir définitivement de nouveaux packages.
Vasily : Et nous ne créerons pas d'utilisateur pour ne pas être sous root ?
Peter : Putain, alors tu dois encore t'amuser avec les droits.
Vasily : J'ai besoin de temps, environ 15 minutes, pour tout rassembler en une seule commande, j'ai lu ça...
(Peter interrompt grossièrement le junior méticuleux et très intelligent.)
Peter : Écrivez dans des commandes séparées, ce sera plus facile à lire.

Dockerfile s'agrandit :

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

Puis Igor Ivanovich, DevOps (mais plus Ops que Dev), fait irruption dans le bureau en criant :

AI : Petya, vos développeurs ont encore cassé la base de données alimentaire, quand cela finira-t-il...

Après une petite escarmouche, Igor Ivanovitch se calme et commence à découvrir ce que font ses collègues ici.

AI : Qu'est-ce que tu fais ?
Vasily : Peter m'aide à créer un Dockerfile pour un nouveau module.
AI : Laissez-moi jeter un oeil... Qu'avez-vous écrit ici, vous nettoyez le référentiel avec une commande séparée, c'est une couche supplémentaire... Mais comment installer des dépendances si vous n'avez pas copié le Gemfile ! Et en général, cela ne sert à rien.
Peter : S'il vous plaît, vaquez à vos affaires, nous trouverons une solution d'une manière ou d'une autre.

Igor Ivanovitch soupire tristement et part chercher qui a cassé la base de données.

Peter : Oui, mais il avait raison à propos du code, nous devons l'insérer dans l'image. Et installons immédiatement ssh et superviseur, sinon nous lancerons les démons.

Vasily : Ensuite, je vais d'abord copier le Gemfile et Gemfile.lock, puis je vais tout installer, puis je copierai l'intégralité du projet. Si le Gemfile ne change pas, la couche sera extraite du cache.
Peter : Pourquoi êtes-vous tous avec ces calques, copiez tout en même temps. Copiez tout de suite. La toute première ligne.

Le Dockerfile ressemble maintenant à ceci :

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

Pierre : Alors, et ensuite ? Avez-vous des configurations pour le superviseur ?
Vasily : Non, non. Mais je vais le faire rapidement.
Peter : Alors tu le feras. Esquissons maintenant un script d'initialisation qui lancera tout. D'accord, vous démarrez donc ssh, avec nohup, afin que nous puissions nous connecter au conteneur et voir ce qui n'a pas fonctionné. Exécutez ensuite le superviseur de la même manière. Eh bien, alors vous venez de courir en tant que passager.
Q : Mais j'ai lu qu'il devrait y avoir un seul processus, afin que Docker sache que quelque chose s'est mal passé et puisse redémarrer le conteneur.
P : Ne vous embêtez pas avec des bêtises. Et en général, comment ? Comment exécuter tout cela en un seul processus ? Laissons Igor Ivanovitch penser à la stabilité, ce n'est pas pour rien qu'il reçoit un salaire. Notre travail consiste à écrire du code. Et en général, qu'il vous remercie d'avoir écrit le Dockefile pour lui.

10 minutes et deux vidéos sur les chats plus tard.

Q : J'ai tout fait. J'ai ajouté plus de commentaires.
P : Montre-moi !

Dernière version 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 : Super, j'aime ça. Et les commentaires sont en russe, pratiques et lisibles, tout le monde travaillerait comme ça. Je t'ai tout appris, tu peux faire le reste toi-même. Allons prendre un café...

Eh bien, nous avons maintenant un Dockerfile parfaitement terrible, dont la vue donnera envie à Igor Ivanovich d'arrêter et ses yeux lui feront mal pendant encore une semaine. Le Dockerfile, bien sûr, pourrait être encore pire, il n'y a pas de limite à la perfection. Mais pour commencer, cela fera l'affaire.

Je voudrais terminer par une citation de Grigory Oster :

Si vous n'êtes pas encore sûr
Nous avons choisi le chemin de la vie,
Et tu ne sais pas pourquoi
Commencez votre parcours professionnel,
Cassez les ampoules dans les couloirs -
Les gens vous diront « Merci ».
Vous aiderez les gens
Économiser l'électricité.

Source: habr.com

Ajouter un commentaire