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

Hinzufügen von Containern zur Docker-Konsole

In einem unserer vorherigen Artikel haben wir Ihnen gezeigt, wie Sie ein Projekt basierend auf der Docker-Drupal-Anwendung starten können. Nun möchten wir einen Schritt weiter gehen und Ihnen zeigen, wie Sie neue Elemente zu unserer Seite hinzufügen können, basierend auf dem Beispiel von Mailcatcher. Wie wir bereits erwähnt haben, können wir dank Docker ein Set von Blöcken erhalten, die – wenn sie richtig angeordnet sind – uns ein gut funktionierendes Projekt geben.

Ausgangspunkt

Alle Befehle und Beispiele in diesem Artikel basieren auf einem Projekt, das Sie zu Hause problemlos ausführen können, indem Sie den Anweisungen im Artikel unter https://www.droptica.com/blog/start-your-adventure-docker-console-example-drupal-7-project/ folgen

Docker-Image

Da wir nun ein funktionierendes Projekt mit docker-console haben, besteht der nächste Schritt darin, das Docker-Image zu finden, das wir hinzufügen möchten. Sie können Images unter https://hub.docker.com/ finden. Es ist am besten, Images zu verwenden, die als offiziell markiert sind oder – falls diese nicht zu finden sind – die beliebtesten. Wir empfehlen auch, unser Repository unter https://hub.docker.com/u/droptica/ zu besuchen. In diesem Beispiel verwenden wir unser eigenes Image, das Sie unter https://hub.docker.com/r/droptica/mailcatcher finden können.

Mailcatcher

Lassen Sie uns mit einer Erklärung beginnen, was genau Mailcatcher ist und warum wir es im Projekt benötigen. Einfach ausgedrückt, ermöglicht uns Mailcatcher, einen SMTP-Server zu betreiben, dank dem wir E-Mail-Nachrichten abfangen können, die von unserer Website gesendet werden. Darüber hinaus bietet es auch eine grafische Benutzeroberfläche (GUI), mit der wir sie einfach und bequem lesen und ansehen können. Mailcatcher ist besonders nützlich für eine Drupal-Agentur wie uns, wo wir oft die von entwickelten Websites gesendeten E-Mails testen müssen. Wenn Sie mehr darüber erfahren möchten, wie Mailcatcher funktioniert, empfehle ich Ihnen, mehr darüber zu lesen unter https://mailcatcher.me/.

Hinzufügen des Images zu einem Projekt

Um ein Image zu einem Projekt hinzuzufügen, müssen Sie die docker-compose.yml-Datei bearbeiten, die die gesamte Struktur unseres Projekts enthält. Nachdem Sie die Datei geöffnet haben, werden Sie sehen, dass das Projekt derzeit aus drei miteinander verbundenen Containern besteht (Web, MySQL und PHPMyAdmin). Das Hinzufügen von Mailcatcher ist nicht besonders anspruchsvoll, da wir nur den Namen des neuen Containers (in diesem Fall Mailcatcher) deklarieren und den Namen des Images angeben müssen, das wir verwenden werden, um diesen Container zu erstellen (in unserem Fall droptica/mailcatcher) in der Variable „image“. Dann verbinden wir das neu erstellte Image mit dem Webcontainer, von dem aus wir E-Mails abfangen möchten (es wird empfohlen, solche Anforderungen in der Image-Beschreibung zu lesen, in diesem Fall unser Basis-Image unter https://hub.docker.com/r/schickling/mailcatcher/). Nachdem dies geschehen ist, sollte die Datei ähnlich wie unten gezeigt aussehen.

Mailcatcher-Image programmatisch hinzufügen

 

Wenn Sie hier einen anderen Container hinzufügen möchten, empfehle ich ebenfalls, einen Blick auf https://docs.docker.com/compose/compose-file/compose-file-v1/ zu werfen, wo Sie eine Beschreibung anderer Befehle finden, die in der docker-compose.yml-Datei verwendet werden können.

Starten eines neuen Containers

Nach dem Hinzufügen eines Images zu einer Datei und dem Speichern der Änderungen ist das Mailcatcher-Image noch nicht gestartet. Dazu müssen wir einen Befehl im Projektverzeichnis ausführen.

dcon up

Wir haben diesen Befehl bereits erwähnt – er dient zum Starten unserer Container. In diesem Fall sollten wir einen neuen Mailcatcher-Container erstellen und zusätzlich den Webcontainer neu erstellen, da wir darin eine Änderung vorgenommen haben und er nun zum Mailcatcher-Container verlinkt werden soll. Sollte der Webcontainer jedoch nicht neu erstellt werden, können wir dies erzwingen, indem wir alle Container im Projekt mit dem folgenden Befehl stoppen:

dcon stop


Und dann durch Ausführen des folgenden Befehls entfernen:

dcon rm


An diesem Punkt können wir die Container mit den neuen Einstellungen neu starten, indem wir den folgenden Befehl ausführen:

dcon up 


Nun, da der Container läuft, können wir überprüfen, ob er tatsächlich funktioniert. Hier möchte ich Sie daran erinnern, dass Sie den Container über seine IP-Adresse erreichen können, die Sie mit dem Befehl „docker inspect“ abfragen können. In unserem Fall wird es sein:

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

Indem Sie die IP-Adresse des Mailcatcher-Containers in einem Browser eingeben (in meinem Fall ist es http://172.17.0.9/), sollten Sie eine GUI sehen, die es Ihnen ermöglicht, E-Mails zu lesen, ähnlich der im Screenshot unten.

einfache grafische Benutzeroberfläche von Mailcatcher

Beispiel eines Containermenüs

Nun, da der Mailcatcher-Container bereits läuft, haben wir noch eine Sache zu erledigen. Wir müssen SMTP-Module und Mailsystem zu unserem Projekt hinzufügen, die es uns ermöglichen, E-Mails zu senden.
Wir können dies auf traditionelle Weise tun, indem wir sie von einer Website herunterladen https://www.drupal.org/project/smtp und https://www.drupal.org/project/mailsystem und sie dann in einen Katalog hinzufügen, oder indem wir den folgenden Befehl ausführen:

dcon drush en mailsystem -y

dcon drush en smtp -y

Nach dem Start der Module müssen wir das Mailsystem-Modul noch so einrichten, dass es SMTP als Standard-Mailsystem verwendet.

 Der Pfeil zeigt auf einen Button, der den Wechsel des Standard-Mailsystems ermöglicht.

 

Wir müssen auch das SMTP-Modul so konfigurieren, dass es unseren Mailcatcher-Container verwendet. Gehen Sie dazu zu /admin/config/system/smtp und geben Sie die Details wie in den Screenshots unten dargestellt ein:

SMTP-Konfiguration

 

Wenn alles in Ordnung ist, sollte der Mailcatcher-Container jetzt eine Beispiel-E-Mail-Adresse enthalten, wie auf dem Screenshot unten.

Standard-Test-E-Mail-Nachricht im Entwickler-Postfach.

An dieser Stelle könnten wir aufhören und uns über einen funktionierenden Mailcatcher freuen, der zusätzlich überprüft, ob er tatsächlich andere Nachrichten abfängt und nicht nur die Testnachricht (z. B. Benutzerregistrierung oder Passworterinnerung). Jedoch möchte ich hier noch ein weiteres Thema ansprechen.

SMTP beim Bauen des Projekts starten

Manchmal gibt es Situationen, in denen wir 100% sicher sein wollen, dass niemand unser SMTP-Modul ausschaltet oder dass wir es nur zum Testen und nicht in der Produktion benötigen. In solchen Fällen können Sie eine Anweisung einfügen, um das Modul in den Projekterstellungsanweisungen zu starten.
Sie können die Schritte im Prozess der Erstellung des Projekts in der dc_overrides.py nachvollziehen, die sich im docker_console-Ordner befindet. Standardmäßig ist kein Befehl zum Starten eines Moduls definiert, weshalb wir ihn hinzufügen sollten (ohne die entsprechenden Klassen zu vergessen zu importieren). Das nachfolgende Beispiel zeigt, wie eine solche Klasse aussehen sollte (die Befehle sind in Python geschrieben, daher ist es notwendig, das Einzugsformat beizubehalten). Dann müssen wir den neu hinzugefügten Befehl nach dem Import der Datenbank zur „build-in-docker“-Anweisung hinzufügen (das Hinzufügen der Funktion vorher wäre sinnlos, da das Löschen und Importieren der Datenbank all unsere Änderungen zunichtemachen würde).

# # Klassen zum Überschreiben importieren
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'
    ]
}

Nun wird alles automatisch beim Erstellen eines Projekts konfiguriert. Jetzt können wir sicher sein, dass keine E-Mails aus unserer lokalen Umgebung gesendet werden.

Projektdaten

Als Standard für diese Artikelserie können Sie, wenn Sie es nicht geschafft haben, das Projekt nach den Anweisungen im Artikel umzubauen, es tun, indem Sie die Projektdateien herunterladen. Sie finden sie im Mailcatcher-Branch unseres Repositories.

Projekt-Repository:

https://github.com/DropticaExamples/docker-console-project-example
Datenbank-Dump:

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

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

Zusammenfassung

Ich bin mir voll bewusst, dass dieser Artikel das Thema des Hinzufügens neuer Container zu Docker-Console-Projekten nicht erschöpft, aber ein solcher Artikel könnte leicht zu einem Buch werden, und selbst das würde nicht ausreichen, um alles abzudecken. Daher empfehle ich, sich die im Artikel enthaltenen Links anzusehen und nicht zu vergessen, Ihre Erfahrungen mit docker zu teilen. Wenn ich jedoch den Prozess des Hinzufügens eines neuen Images zu einem Projekt in wenigen kurzen Schritten zusammenfassen sollte, wären diese:

  •     Ein Image finden oder erstellen, das Sie hinzufügen möchten;
  •     Anforderungen für den Betrieb eines bestimmten Images kennenlernen;
  •     Hinzufügen des Images zur docker-compose.yml;
  •     Konfiguration in Drupal hinzufügen (falls das Image dies erfordert);
  •     Container (dcon up) oder das gesamte Projekt (dcon build – nicht immer notwendig) neu erstellen;
  •     Funktion eines neuen Projektelements testen.

Wenn Ihnen die Projekte mit docker-console gefallen haben, sollten Sie unbedingt unserem Blog folgen, da wir in Zukunft weitere Artikel zu diesem Thema veröffentlichen werden.

3. Best practices for software development teams