From 037dcec7cde12309851c54fd79f1d437abb9d3bd Mon Sep 17 00:00:00 2001 From: Jesus Manuel Olivas Date: Wed, 21 Mar 2018 00:54:23 -0700 Subject: [PATCH] [docker:init] Add command. (#3839) --- src/Command/DockerInitCommand.php | 82 +++++++++++++++++++++++++ src/Generator/DockerInitGenerator.php | 41 +++++++++++++ templates/files/docker-compose.yml.twig | 73 ++++++++++++++++++++++ 3 files changed, 196 insertions(+) create mode 100644 src/Command/DockerInitCommand.php create mode 100644 src/Generator/DockerInitGenerator.php create mode 100644 templates/files/docker-compose.yml.twig diff --git a/src/Command/DockerInitCommand.php b/src/Command/DockerInitCommand.php new file mode 100644 index 000000000..3ecef1808 --- /dev/null +++ b/src/Command/DockerInitCommand.php @@ -0,0 +1,82 @@ +generator = $generator; + parent::__construct(); + } + + + /** + * {@inheritdoc} + */ + protected function configure() + { + $this + ->setName('docker:init') + ->setDescription( + $this->trans('commands.docker.init.description') + ) + ->setHelp($this->trans('commands.docker.init.description')); + } + + /** + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) + { + $io = new DrupalStyle($input, $output); + $fs = new Filesystem(); + $dockerComposeFiles = [ + $this->drupalFinder->getComposerRoot() . '/docker-compose.yml', + $this->drupalFinder->getComposerRoot() . '/docker-compose.yaml' + ]; + + $dockerComposeFile = $this->validateFileExists( + $fs, + $dockerComposeFiles, + false + ); + + if (!$dockerComposeFile) { + $dockerComposeFile = $this->drupalFinder->getComposerRoot() . '/docker-compose.yml'; + } + + $this->backUpFile($fs, $dockerComposeFile); + + $parameters = [ + 'docker_compose_file' => $dockerComposeFile + ]; + + $this->generator->setIo($io); + $this->generator->generate($parameters); + } + +} diff --git a/src/Generator/DockerInitGenerator.php b/src/Generator/DockerInitGenerator.php new file mode 100644 index 000000000..f2d254c8a --- /dev/null +++ b/src/Generator/DockerInitGenerator.php @@ -0,0 +1,41 @@ +getVolumeConfiguration(); + + $dockerComposeFile = $parameters['docker_compose_file']; + unset($parameters['docker_compose_file']); + + $this->renderFile( + 'files/docker-compose.yml.twig', + $dockerComposeFile, + $parameters + ); + } + + protected function getVolumeConfiguration() { + $volumeConfiguration = [ + 'darwin' => ':cached' + ]; + + $osType = strtolower(PHP_OS); + + return array_key_exists($osType, $volumeConfiguration)?$volumeConfiguration[$osType]:''; + } +} diff --git a/templates/files/docker-compose.yml.twig b/templates/files/docker-compose.yml.twig new file mode 100644 index 000000000..974a31d0a --- /dev/null +++ b/templates/files/docker-compose.yml.twig @@ -0,0 +1,73 @@ +version: "2.3" + +services: + mariadb: + image: wodby/mariadb:10.2-3.0.2 + env_file: ./.env + environment: + MYSQL_RANDOM_ROOT_PASSWORD: 'true' + MYSQL_DATABASE: ${DATABASE_NAME} + MYSQL_USER: ${DATABASE_USER} + MYSQL_PASSWORD: ${DATABASE_PASSWORD} + volumes: + - mysqldata:/var/lib/mysql + # Uncomment next line and place DDb dump.sql file(s) here + # - ./mariadb-init:/docker-entrypoint-initdb.d + healthcheck: + test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + timeout: 20s + retries: 10 + + php: + image: wodby/drupal-php:7.0-2.4.3 + env_file: ./.env + environment: + PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S mailhog:1025 + DB_HOST: ${DATABASE_HOST} + DB_USER: ${DATABASE_USER} + DB_PASSWORD: ${DATABASE_PASSWORD} + DB_NAME: ${DATABASE_NAME} + DB_DRIVER: mysql + volumes: + - ./:${DRUPAL_ROOT}{{ volume_configuration }} + depends_on: + mariadb: + condition: service_healthy + + nginx: + image: wodby/drupal-nginx:8-1.13-2.4.2 + env_file: ./.env + depends_on: + - php + environment: + NGINX_STATIC_CONTENT_OPEN_FILE_CACHE: "off" + NGINX_ERROR_LOG_LEVEL: debug + NGINX_BACKEND_HOST: php + NGINX_SERVER_ROOT: ${SERVER_ROOT} + volumes: + - ./:${DRUPAL_ROOT}{{ volume_configuration }} + labels: + - 'traefik.backend=nginx' + - 'traefik.port=80' + - 'traefik.frontend.rule=Host:${HOST_NAME}' + + mailhog: + image: mailhog/mailhog + env_file: ./.env + labels: + - 'traefik.backend=mailhog' + - 'traefik.port=8025' + - 'traefik.frontend.rule=Host:mailhog.${HOST_NAME}' + + traefik: + image: traefik + env_file: ./.env + command: -c /dev/null --web --docker --logLevel=INFO + ports: + - '${HOST_PORT}:80' + volumes: + - /var/run/docker.sock:/var/run/docker.sock + +volumes: + mysqldata: + driver: "local"