Docker and mailcatcher logo are visible on the opposite sides of an image at the top. They are separated by a grab lifting a unit marked with an envelope from a stack of identical blue containers

Ajout de conteneurs à Docker-console

Dans l'un de nos articles précédents, nous vous avons montré comment démarrer un projet basé sur l'application docker-drupal. Maintenant, nous aimerions aller un peu plus loin et vous montrer comment ajouter de nouveaux éléments à notre site en prenant l'exemple de mailcatcher. Comme nous l'avons mentionné précédemment, grâce à docker, nous pouvons obtenir un ensemble de blocs qui, correctement arrangés, nous donnent un projet fonctionnant correctement.

Point de départ

Toutes les commandes et exemples de cet article seront basés sur un projet que vous pouvez facilement exécuter chez vous en suivant les instructions de l'article à https://www.droptica.com/blog/start-your-adventure-docker-console-example-drupal-7-project/

Image Docker

Maintenant que nous avons un projet fonctionnant avec docker-console, l'étape suivante consiste à trouver l'image docker que nous voulons y ajouter. Vous pouvez trouver des images sur https://hub.docker.com/. Il est préférable d'utiliser des images marquées comme officielles ou, si elles sont introuvables, les plus populaires. Nous recommandons également de visiter notre dépôt à https://hub.docker.com/u/droptica/. Dans cet exemple, nous utiliserons notre propre image, qui peut être trouvée à https://hub.docker.com/r/droptica/mailcatcher/.

Mailcatcher 

Commençons par expliquer ce qu'est exactement mailcatcher et pourquoi nous en avons besoin dans le projet. En termes simples, mailcatcher nous permet d'exécuter un serveur SMTP, grâce auquel nous pouvons intercepter les messages e-mail envoyés par notre site Web. De plus, il fournit également une interface GUI, grâce à laquelle nous pourrons les lire et voir à quoi ils ressemblent de manière simple et pratique. Mailcatcher est particulièrement utile pour une agence Drupal comme la nôtre, où nous devons souvent tester les e-mails envoyés par les sites développés. Si vous souhaitez en savoir plus sur le fonctionnement de mailcatcher, je vous recommande de lire plus à https://mailcatcher.me/.

Ajout de l'image à un projet

Pour ajouter une image à un projet, il faut éditer le fichier docker-compose.yml, qui contient toute la structure de notre projet. Après avoir ouvert le fichier, vous verrez qu'actuellement, le projet est composé de trois conteneurs interconnectés (web, MySQL et PHPMyAdmin). Ajouter mailcatcher n'est pas particulièrement exigeant car nous devons seulement déclarer le nom du nouveau conteneur (mailcatcher dans ce cas), et spécifier le nom de l'image que nous allons utiliser pour construire ce conteneur (droptica/mailcatcher dans notre cas) dans la variable "image". Ensuite, nous lions l'image nouvellement créée au conteneur web à partir duquel nous voulons intercepter les e-mails (il est recommandé de lire sur ces exigences dans la description de l'image, dans ce cas, ce serait notre image de base à https://hub.docker.com/r/schickling/mailcatcher/). Après cela, le fichier devrait ressembler à celui présenté ci-dessous. 

ajout d'une image mailcatcher par programmation

 

Si vous souhaitez ajouter un autre conteneur ici, je vous recommande également de consulter https://docs.docker.com/compose/compose-file/compose-file-v1/, où vous trouverez une description des autres commandes qui peuvent être utilisées dans le fichier docker-compose.yml.

Démarrage d'un nouveau conteneur

Après avoir ajouté une image à un fichier et enregistré les modifications, l'image mailcatcher n'est pas encore démarrée. Pour ce faire, nous devons exécuter une commande dans le répertoire du projet. 

dcon up

Nous avons déjà mentionné cette commande - elle est utilisée pour démarrer nos conteneurs. Dans ce cas, nous devrions construire un nouveau conteneur mailcatcher et en plus reconstruire le conteneur web car nous avons effectué une modification et maintenant il est supposé se lier au conteneur mailcatcher. Au cas où, si le conteneur web ne se reconstruit pas, nous pouvons le forcer en arrêtant tous les conteneurs du projet en utilisant la commande suivante :  

dcon stop


Puis en les supprimant en exécutant :

dcon rm


À ce stade, nous pouvons redémarrer les conteneurs avec les nouveaux paramètres en exécutant la commande suivante : 

dcon up 


Maintenant, lorsque le conteneur est en cours d'exécution, nous pouvons vérifier s'il fonctionne réellement. Ici, je voudrais vous rappeler que vous pouvez accéder au conteneur en utilisant son adresse IP, que vous pouvez vérifier avec la commande "docker inspect". Dans notre cas, ce sera :

docker inspect --format "{{ .NetworkSettings.IPAddress }}" dockerconsoleprojectexample_mailcatcher_1  

En entrant l'adresse IP du conteneur mailcatcher dans un navigateur (dans mon cas, c'est http://172.17.0.9/), vous devriez voir une interface GUI vous permettant de lire les e-mails, semblable à celle de la capture d'écran ci-dessous.

interface graphique simple de mailcatcher

Tableau de bord des conteneurs exemple

Maintenant que nous avons déjà un conteneur mailcatcher en cours d'exécution, nous avons encore une chose à faire. Nous devons ajouter les modules SMTP et mailsystem à notre projet, ce qui nous permettra d'envoyer des e-mails.
Nous pouvons le faire de la manière traditionnelle en les téléchargeant depuis un site web https://www.drupal.org/project/smtp et https://www.drupal.org/project/mailsystem puis en les ajoutant à un catalogue, ou en exécutant la commande suivante : 

dcon drush en mailsystem -y

dcon drush en smtp -y

Après avoir démarré les modules, nous devons encore configurer le module mailsystem pour utiliser SMTP comme système de messagerie par défaut.

La flèche pointe sur un bouton qui permet de changer le système de messagerie par défaut.

 

Nous devons également configurer le module SMTP pour utiliser notre conteneur mailcatcher. Pour ce faire, allez à /admin/config/system/smtp et définissez les détails comme présenté dans les captures d'écran ci-dessous :

Configuration SMTP

 

Si tout va bien, le conteneur mailcatcher devrait maintenant contenir une adresse e-mail exemple, comme sur la capture d'écran ci-dessous.

Message e-mail de test par défaut dans la boîte de réception du développeur.

À ce stade, nous pourrions finir et profiter d'avoir un mailcatcher fonctionnel, en vérifiant également s'il intercepte réellement d'autres messages et pas seulement le test (par exemple, l'enregistrement des utilisateurs ou le rappel de mot de passe). Cependant, je voudrais parler d'une autre chose ici.

Démarrage de SMTP lors de la construction du projet

Il peut parfois y avoir une situation où nous voulons être sûrs à 100 % que personne n'éteindra notre module SMTP ou que nous en avons besoin uniquement pour les tests et non en production. Dans ces cas, vous pouvez inclure une instruction pour démarrer ce module dans les instructions de construction du projet.
Vous pouvez vérifier les étapes impliquées dans le processus de construction du projet dans le fichier dc_overrides.py, que vous pouvez trouver dans le dossier docker_console. Par défaut, il n'y a pas de commande définie pour démarrer un module, c'est pourquoi nous devrions l'ajouter (sans oublier d'importer les classes correspondantes). L'exemple ci-dessous montre à quoi devrait ressembler une telle classe (les commandes sont écrites en Python ; il est donc nécessaire de conserver la mise en page des indentations). Ensuite, nous devons ajouter la commande nouvellement ajoutée à l'instruction "build-in-docker" après l'importation de la base de données (ajouter la fonction plus tôt serait inutile, car l'effacement et l'importation de la base de données se débarrasseraient de tous nos changements).

# # import classes to override
from docker_console.web.engines.drupal7.builder import Builder

class BuilderLocal:
    def enable_mailcatcher(self):
        self.drush.en("mailsystem")
        self.drush.en("smtp")
        self.drush.run("vset -y 'smtp_host' 'mailcatcher'")
        self.drush.run("vset -y 'smtp_on' 1")
        self.drush.run("vset -y 'smtp_protocol' 'standard'")
        self.drush.run("vset -y 'smtp_port' 1025")
        self.drush.run("vdel -y 'smtp_username'")
        self.drush.run("vdel -y 'smtp_password'")

Builder.__bases__ += (BuilderLocal,)

commands_overrides = {
 
    'build-in-docker': [
        'drupal_settings.copy_settings("drupal7")',
        'archive.unpack_files(True)',
       
        'database.drop_db',
        'database.create_db',
        'database.import_db',
        'enable_mailcatcher',
        'drush.updb',

        'drush.uli'
    ]
}

Maintenant, après avoir exécuté dcon build -y, vous aurez tous les modules nécessaires et le module SMTP configuré. Il ne reste plus qu'à configurer le module mailsystem. Nous pouvons le faire manuellement ou, comme dans le cas du module SMTP, écrire la méthode appropriée dans le fichier dc_overrides.py, qui devrait ressembler à celle ci-dessous.

# # import classes to override
from docker_console.web.engines.drupal7.builder import Builder

class BuilderLocal:
    def enable_mailcatcher(self):
        self.drush.en("mailsystem")
        self.drush.en("smtp")
        self.drush.run("vset -y 'smtp_host' 'mailcatcher'")
        self.drush.run("vset -y 'smtp_on' 1")
        self.drush.run("vset -y 'smtp_protocol' 'standard'")
        self.drush.run("vset -y 'smtp_port' 1025")
        self.drush.run("vdel -y 'smtp_username'")
        self.drush.run("vdel -y 'smtp_password'")

    def enable_mailsystem(self):
        self.drush.en("mailsystem")
        php = """
            variable_set("mail_system", ["default-system" => "SmtpMailSystem"]);
        """
        self.drush.run("php-eval '%s'" % (php,))

Builder.__bases__ += (BuilderLocal,)

commands_overrides = {
 
    'build-in-docker': [
        'drupal_settings.copy_settings("drupal7")',
        'archive.unpack_files(True)',
       
        'database.drop_db',
        'database.create_db',
        'database.import_db',
        'enable_mailcatcher',
        'enable_mailsystem',
        'drush.updb',

        'drush.uli'
    ]
}

Maintenant, tout sera configuré automatiquement lors de la construction d'un projet. Nous pouvons maintenant être certains que les e-mails ne seront pas envoyés depuis notre environnement local.

Fichiers du projet

Comme standard pour cette série d’articles, si vous n’avez pas réussi à refondre le projet en utilisant les instructions de l’article, vous pouvez le faire en téléchargeant les fichiers du projet. Vous pouvez les trouver dans la branche mailcatcher de notre dépôt.

Dépôt du projet :

https://github.com/DropticaExamples/docker-console-project-example
Dump de la base de données :

https://www.dropbox.com/s/r0o3u9gjp3dccd4/database.sql.tar.gz?dl=0
Fichiers du projet :

https://www.dropbox.com/s/hl506wciwj60fds/files.tar.gz?dl=0

Résumé

Je suis pleinement conscient que cet article n’épuise pas le sujet de l’ajout de nouveaux conteneurs aux projets de console docker, mais un tel article pourrait facilement se transformer en un livre, et cela ne suffirait même pas à tout couvrir. Par conséquent, je recommande de jeter un œil aux liens de l’article et de ne pas oublier de partager vos expériences avec docker. Cependant, si je devais résumer le processus d’ajout d’une nouvelle image à un projet en quelques étapes courtes, elles seraient :

  •     trouver ou créer une image que vous souhaitez ajouter ;
  •     apprendre les exigences pour exécuter une image donnée ;
  •     ajouter l’image au docker-compose.yml ;
  •     ajouter la configuration dans Drupal (si l’image le nécessite) ;
  •     rebâtir les conteneurs (dcon up) ou le projet entier (dcon build – pas toujours nécessaire) ;
  •     tester le fonctionnement d’un nouvel élément du projet.

Si vous avez aimé les projets utilisant docker-console, vous devriez absolument suivre notre blog, car nous allons publier plus d'articles sur ce sujet à l'avenir.

3. Best practices for software development teams