Logo dockera i mailcatchera widoczne są po przeciwnych stronach obrazka w górnej jego części. Rozdziela je chwytak podnoszący ze stosu równych, niebieskich kontenerów jednostkę oznaczoną kopertą

Dodawanie kontenerów do dcona

W jednym z wcześniejszych artykułów pokazaliśmy Wam jak uruchomić projekt w oparciu o aplikację docker-drupal. Teraz chcielibyśmy pójść krok dalej i pokazać na przykładzie mailcatchera jak dodawać do naszej strony kolejne elementy. Jak już wcześniej wspominaliśmy, dzięki dockerowi otrzymujemy zestaw klocków, które odpowiednio poukładane dają nam naprawdę fajnie działający projekt.

Punkt startowy

Wszystkie komendy i przykłady w tym artykule będą bazowały na projekcie, który możecie łatwo uruchomić u siebie wykonując polecenia z artykułu https://www.droptica.pl/blog/rozpocznij-swoja-przygode-z-docker-console-na-przykladzie-projektu-drupal-7/ 

Obraz dockera

Teraz kiedy mamy już działający projekt z docker-console, to kolejnym krokiem jest znalezienie obrazu dockerowego, który chcemy do niego dodać. Obrazy znajdziecie na stronie https://hub.docker.com/. Najlepiej jest używać obrazów oznaczonych jako oficjalne lub w przypadku braku takich wybranie obrazów najpopularniejszych. Polecamy również zajrzeć do naszego repozytorium https://hub.docker.com/u/droptica/. W naszym przykładzie będziemy właśnie używać naszego obrazu, który można znaleźć pod adresem https://hub.docker.com/r/droptica/mailcatcher/.

Mailcatcher 

Na początku wyjaśnijmy sobie, czym jest mailcather i po co jest on nam potrzebny w projekcie. Tak więc w najprostszych słowach, mailcatcher pozwala nam uruchomić serwer SMTP, dzięki któremu możemy przechwytywać wiadomości e-mail, jakie będzie wysyłała nasza strona. Dodatkowo dostarcza też graficzny interfejs, dzięki któremu będziemy mogli te wiadomości odczytywać i sprawdzać ich wygląd w łatwy i przyjemny sposób. Mailcatcher jest szczególnie przydatny agencji drupalowej takiej jak nasza, gdzie często musimy testować e-maile przed wysyłką. Jeżeli potrzebujecie dowiedzieć się czegoś więcej o działaniu mailcatchera polecam zajrzeć na stronę https://mailcatcher.me/.

Dodanie obrazu do projektu

Aby dodać obraz do projektu, należy edytować plik docker-compose.yml, w którym zapisana jest cała struktura naszego projektu. Po jego otwarciu widzimy, że aktualnie nasz projekt zbudowany jest z trzech kontenerów (web, mysql i phpmyadmin) powiązanych wzajemnie ze sobą. Dodanie mailcatchera nie jest szczególnie wymagające, gdyż musimy tylko zadeklarować nazwę nowego kontenera (w tym przypadku mailcatcher) oraz w zmiennej ‘image’ podać nazwę obrazu, jakiego będziemy używać do zbudowania tego kontenera (w naszym przypadku droptica/mailcatcher). Następnie podlinkowujemy nowo utworzony obraz do kontenera web, z którego będziemy chcieli przechwytywać maile (o tego typu wymaganiach najlepiej czytać w opisie obrazu; w naszym wypadku obrazu bazowego https://hub.docker.com/r/schickling/mailcatcher/). Po tym nasz plik powinien wyglądać podobnie jak ten przedstawiony poniżej. 

 

Piece of code reflecting last changes

 


Jeżeli chcecie dodać tutaj jakiś inny kontener, polecam zajrzeć również na stronę https://docs.docker.com/compose/compose-file/compose-file-v1/, gdzie znajdziecie opis pozostałych poleceń, jakie mogą być używane w pliku docker-compose.yml.

Uruchomienie nowego kontenera

Po dodaniu obrazu do pliku i zapisaniu zmian, obraz mailcatchera nie jest jeszcze uruchomiony. Aby to zrobić, musimy w katalogu z projektem wywołać polecenie 

dcon up

Już wcześniej wspominaliśmy o tym poleceniu, służy ono do uruchomienia kontenerów. W tym przypadku powinien nam się zbudować nowy kontener z mailcatcherem oraz dodatkowo przebudować kontener web, ponieważ zrobiliśmy w nim zmianę i teraz ma on linkować do kontenera mailcatchera. W przypadku, gdyby jednak kontener web się nie przebudował, możemy to wymusić, zatrzymując wszystkie kontenery na projekcie poleceniem:  

dcon stop

Następnie usuwając je poleceniem:

dcon rm

Teraz możemy uruchomić kontenery od nowa, już z nowymi ustawieniami wpisując komendę: 

dcon up 

Teraz kiedy kontener jest uruchomiony, możemy sprawdzić, czy faktycznie działa. Przypominam, że do kontenera możemy dostać się dzięki jego IP, które możemy podejrzeć używając komendy “docker inspect”. W naszym przypadku będzie to:

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

Wpisując w przeglądarkę adres kontenera z mailcatcherem (w moim przypadku http://172.17.0.9/), powinniście zobaczyć graficzny interfejs pozwalający na odczytywanie maili podobny do tego na screenie poniżej.

 

Przykładowy kokpit kontenera

 

Moduły SMTP i mailsystem

Teraz, kiedy mamy już działający kontener z mailcatcherem, pozostaje nam jeszcze jedna rzecz do zrobienia. Musimy do naszego projektu dodać moduły SMTP i mailsystem, które umożliwią nam wysyłanie maili.
Możemy to zrobić w tradycyjny sposób pobierając je ze strony https://www.drupal.org/project/smtp oraz https://www.drupal.org/project/mailsystem, a następnie dodając do katalogu app/sites/all/modules/contrib/ lub poprzez polecenie: 

dcon drush en mailsystem -y

dcon drush en smtp -y

Po włączeniu modułów pozostaje nam jeszcze ustawić moduł mailsystem tak, aby korzystał z SMTP jako domyślnego systemu mailowego.

 

Strzałka wskazuje przycisk pozwalający na zmianę domyślnego systemu mailowania

 

Musimy także skonfigurować moduł SMTP tak, aby korzystał on z naszego kontenera z mailcatcherem. Żeby to zrobić na stronie /admin/config/system/smtp powinniśmy ustawić dane takie jak na screenach poniżej:

 

Ustawienia smtp

Ustawienia smtp

Ustawienia smtp

 

Jeżeli wszystko przebiegło dobrze, w naszym kontenerze z mailcatcherem powinien pokazać się przykładowy mail jak na screenie poniżej.

 

Domyślny e-mal testowy w skrzynce odbiorczej developera

 

Moglibyśmy w tym miejscu skończyć i cieszyć się z naszego działającego mailcatchera, dodatkowo sprawdzając, czy faktycznie przechwytuje on pozostałe wiadomości, a nie tylko tą testową (np. rejestracja użytkownika lub przypomnienie hasła).  Chcę jednak tu poruszyć jeszcze jeden temat.

 

Dodanie włączenia SMTP podczas budowania projektu

Czasami może wystąpić sytuacja, w której chcemy mieć 100% pewność, że nikt nam modułu SMTP nie wyłączy lub jest on nam potrzeby wyłącznie do testów, a nie na produkcji. Wówczas możemy dodać włączenie tego modułu do instrukcji budowania projektu.
Z jakich kroków składa się proces budowania naszego projektu możemy sprawdzić w pliku dc_overrides.py znajdującym się w katalogu docker_console. Standardowo nie mamy zdefiniowanego polecenia do włączania modułu, dlatego też musimy go dodać (nie zapominając o zaimportowaniu odpowiednich klas). W przykładzie poniżej pokazano, jak taka funkcja powinna wyglądać (polecenia są pisane w języku Python, dlatego ważne jest zachowanie układu wcięć). Następnie, dodane polecenie dodajemy do instrukcji “build-in-docker” po wykonaniu importu bazy (dodanie tej instrukcji wcześniej nie miałoby sensu, gdyż wyczyszczenie bazy i import zniwelowałyby nasze zmiany).

 

# # 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'
    ]
}

 

Teraz po wykonaniu polecenia dcon build -y będziemy mieli już dostępne potrzebne moduły i skonfigurowany moduł SMTP. Pozostanie nam jedynie skonfigurować moduł mailsystem. Możemy to zrobić ręcznie lub jak w przypadku modułu SMTP napisać odpowiednią metodę w pliku dc_overrides.py, który wówczas powinien wyglądać jak ten ponieżej.

# # 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'
    ]
}

Teraz wszystko będzie się konfigurowało automatycznie podczas budowania projektu. Dzięki czemu możemy mieć pewność, że maile nie będą wysyłane z naszego środowiska lokalnego.

Pliki projektu

Standardowo dla tej serii wpisów, jeżeli komuś nie udało się u siebie odtworzyć projektu podążając za wpisem, może to zrobić pobierając pliki projektu. W repozytorium znajdują się one na branchu mailcatcher.

Repozytorium projektu:
https://github.com/DropticaExamples/docker-console-project-example  
Zrzut bazy danych:
https://www.dropbox.com/s/r0o3u9gjp3dccd4/database.sql.tar.gz?dl=0  
Pliki projektu:
https://www.dropbox.com/s/hl506wciwj60fds/files.tar.gz?dl=0

Podsumowanie

Jestem świadomy, że tym wpisem nie wyczerpuję tematu dodawania dodatkowych kontenerów do projektów docker console, ale taki wpis z pewnością mógłby się przerodzić w książkę, którą ciężko byłoby w całości domknąć. Polecam zatem dokładniej przejrzeć linki załączone do tego artykułu i dzielić się z nami swoimi doświadczeniami związanymi z dockerem. Jeśli natomiast miałbym w kilku krótkich punktach podsumować proces dodawania nowego obrazu do projektu, byłoby to:

  • znalezienie lub stworzenie obrazu, który chcemy dodać;
  • zapoznanie się z wymaganiami koniecznymi do uruchomienia tego obrazu;
  • dodanie obrazu do pliku docker-compose.yml;
  • dodanie konfiguracji po stronie Drupala (jeżeli dodawany obraz tego wymaga);
  • przebudowanie kontenerów (dcon up) lub całego projektu (dcon build - nie zawsze wymagane);
  • testowanie działania nowego elementu projektu.

Jeżeli spodobały CI się projekty z wykorzystaniem docker-console, koniecznie śledź dalej naszego bloga, gdyż na pewno będą pojawiały się tu kolejne wpisy w tej tematyce. 
 

3. Najlepsze praktyki zespołów programistycznych