decoding

Magento 2 con Docker su Mac OSX genera errore guru meditation

Reading Time: 2 minutesFavoriteLoadingAggiungi ai preferiti

Ritengo di non essere stato l’unico nel verificare che Magento 2 con Docker, su Mac OSX, genera l’errore Guru Meditation di Varnish; codice errore 503.

L’errore è dovuto ai problemi di performance di Docker con il file system di OSX; riporto qui l’articolo presenta nella documentazione Docker e in cui se  ne parla https://docs.docker.com/docker-for-mac/osxfs-caching/

Fatto sta che, con la configurazione classica del nostro docker compose, di cui riporto un esempio, Magento 2 è veramente troppo lento, tanto lento da generare frequentissimi errori 503 di Varnish. Il nostro amato guru è in perenne meditazione 😀

 

Descritto il problema, vediamo ora come sia possibile risolverlo, senza abbandonare il nostro amato Mac.

In nostro soccorso viene docker-sync, un fantastico tool con cui gestire la condivisione dei volumi tra Docker e Mac OSX.

In pratica deleghiamo a docker-sync il compito di gestire la condivisione dei volumi.

Di seguito mostro come ho gestito io queta condivisione tramite la configurazione sia di docker-sync, sia di docker.

Ho generato il seguente file di configurazione docker-sync.yml

version: "2"

options:
  verbose: true
syncs:
  apache2-sync: 
    src: './magento2'
    sync_userid: '1000'
    monit_high_cpu_cycles: 2
    notify_terminal: true

Quindi ho creato il seguente file di configurazione, per docker-compose, docker-compose-osx.yml

version: "2"
services:
  web:
    build:
      context: .
      dockerfile: ./Dockerfile
    links:
      - db
    volumes:
      - apache2-sync:/var/www/html:nocopy,delegated

  varnish:
    image: meanbee/magento2-varnish:latest
    environment:
      - VIRTUAL_HOST=magento2.docker
      - VIRTUAL_PORT=80
      - HTTPS_METHOD=noredirect
    ports:
      - 80:80
    links:
      - web
    depends_on:
      - web

  db:
    image: mariadb:10
    ports:
      - 3300:3306
    volumes:
      - ./database:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=magento2
      - MYSQL_DATABASE=magento2
      - MYSQL_USER=magento2
      - MYSQL_PASSWORD=magento2
      - TERM=meh

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    links:
      - db
    ports:
      - 8080:80


  mailhog:
    container_name: mailhog
    image: mailhog/mailhog
    restart: always
    ports:
      - 1025:1025 #smtp server
      - 8025:8025 #web ui

volumes:
  apache2-sync:
    external: true

Come vedete, rispetto al docker-compose.yml precedente, ho

  • modificato il volume di apache in ‘apache2-sync:/var/www/html:nocopy,delegated’
  • ho aggiunto il volume ‘volumes: apache2-sync: external: true’

Creati questi file di configurazione possiamo lanciare docker, ricordandoci di

  • lanciare docker-sync prima di docker-compose
  • far leggere a docker-compose il file di configurazione docker-compose-osx.yml preparto appositaente per il mac

quindi dobbiamo seguire la sequenza

  • docker-sync start
  • docker-compose -f docker-compose-osx.yml up -d

Io, al fine di facilitarmi il lavoro e di dimenticarmi di lanciare docker-sync, ho preparato uno script sh come questo

#!/bin/sh
echo "-------------------------------------\r\n";
echo "Start Magento 2 Docker for OSX System\r\n";
echo "-------------------------------------\r\n\r\n\r\n";

echo "Check and Stop containers if actives\r\n";
echo "------------------------------------\r\n";
docker-sync stop;
echo "\r\n";
docker-compose -f docker-compose.mac.yml down;
echo "\r\n";
echo "\r\n";

echo "Now start the containers\r\n";
echo "------------------------\r\n";
docker-sync start;
echo "\r\n";
docker-compose -f docker-compose.mac.yml up -d;
echo "\r\n";

echo "Docker Status\r\n";
echo "-------------\r\n";
docker ps;

Spero possa esserti utile.