Dockerizar un proyecto en DDEV!
Buenasss!
¡Que tal estais Drupaleros! Quería compartir con vosotros la manera de poder dockerizar un proyecto en ddev, de esta manera vamos a poder tener dentro de nuestro local todos los proyectos que queramos cada uno con sus versiones y si que entren en conflicto entre sí, y lo mejor de todo es que son proyectos que no partieron desde ddev, vamos a ver un proyecto que no estaba dockerizado y lo vamos a dockerizar pudiendo disfrutar de todas las herramientas que esto nos aporta.
Para los que aún no sepan lo que es DDEV, DDEV es una herramienta de código abierto que simplifica enormemente la puesta en funcionamiento de entornos de desarrollo PHP locales en cuestión de minutos. Es potente y flexible como resultado de sus configuraciones de entorno por proyecto, que se pueden ampliar, controlar la versión y compartir. En resumen, DDEV tiene como objetivo permitir que los equipos de desarrollo utilicen Docker en su flujo de trabajo sin las complejidades de la configuración a medida.
Las cosas de palacio van despacio…vamos a preparar el entorno!
Para poder comenzar con esta nueva práctica hay que preparar el entorno, para ello tenemos el post de nuestro amigo Davidjguru -> drupal-techniques-deploy-environments-with-ddev Dentro de el siguiente post realizaremos los puntos del 1 al 5, una vez realizados dichas instrucciones podremos comenzar con la instalación!
Al lio!
Nos posicionamos en la raíz del proyecto que queremos dockerizar desde nuestro terminal y ejecutaremos el siguiente comando.
drupal@drupal:~/proyectolimpio$ ddev config
Acto seguido nos mostrará el siguiente mensaje y nos preguntará el nombre que le queremos poner al proyecto que estamos dockerizando, lo dejaremos por defecto el que nos indica por lo que le daremos a intro.
drupal@drupal:~/proyectolimpio$ ddev config
Creating a new ddev project config in the current directory (/home/drupal/proyectolimpio)
Once completed, your configuration will be written to /home/drupal/proyectolimpio/.ddev/config.yaml
Project name (proyectolimpio):
Nos preguntará la localización que le queremos asignar y lo dejaremos por defecto también.
The docroot is the directory from which your site is served.
This is a relative path from your project root at /home/drupal/proyectolimpio
You may leave this value blank if your site files are in the project root
Docroot Location (current directory):
Ahora nos preguntará que versión vamos a instalar, en nuestro caso es un Drupal 8 por lo que dejaremos el que nos muestra por defecto.
Found a drupal8 codebase at /home/drupal/proyectolimpio.
Project Type [backdrop, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress] (drupal8):
Es posible que te salga un error de permisos.
Project Type [backdrop, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress] (drupal8):
Ensuring write permissions for proyectolimpio
Existing settings.php file does not include settings.ddev.php, modifying to include ddev settings
Configuration complete. You may now run 'ddev start'.
app.FindContainerByType(db) failed
app.FindContainerByType(web) failed
Failed to execute FindContainerByLabels(map[com.docker.compose.project:ddev-ssh-agent]): Get "http://unix.sock/containers/json?all=1&filters=%7B%22label%22%3A%5B%22com.docker.compose.project%3Dddev-ssh-agent%22%5D%7D": dial unix /var/run/docker.sock: connect: permission denied
En mi caso había que darle permisos al directorio docker que se encuentra en /var/run.
sudo chmod 666 /var/run/docker*
Y si todo ha ido bien ya tendremos nuestro proyecto con DDEV!
Project Type [backdrop, drupal6, drupal7, drupal8, drupal9, laravel, magento, magento2, php, shopware6, typo3, wordpress] (drupal8):
Ensuring write permissions for proyectolimpio
Existing settings.php file includes settings.ddev.php
Configuration complete. You may now run 'ddev start'.
Ya podemos arrancarlo mediante el comando “DDEV start”, si tenemos más de un proyecto es posible que nos de un error porque el contenedor ddev-router lo estamos utilizando con otro proyecto, este error me salió a mí.
drupal@drupal:~/proyectolimpio$ ddev start
Starting proyectolimpio...
Building ddev-ssh-agent
Recreating ddev-ssh-agent ...
Recreating ddev-ssh-agent ... done
ssh-agent container is running: If you want to add authentication to the ssh-agent container, run 'ddev auth ssh' to enable your keys.
mkcert may not be properly installed, we suggest installing it for trusted https support, `brew install mkcert nss`, `choco install -y mkcert`, etc. and then `mkcert -install`
Running Command=ip address show dev docker0
Building db
Building web
Creating ddev-proyectolimpio-db ...
Creating ddev-proyectolimpio-db ... done
Creating ddev-proyectolimpio-dba ...
Creating ddev-proyectolimpio-web ...
Creating ddev-proyectolimpio-web ... done
Creating ddev-proyectolimpio-dba ... done
Starting ddev-router ...
Starting ddev-router ... done
Failed to start proyectolimpio: ddev-router failed to become ready; debug with 'docker logs ddev-router'; logOutput=container was previously healthy, so sleeping 59 seconds before continuing healthcheck... , err=container /ddev-router unhealthy: container was previously healthy, so sleeping 59 seconds before continuing healthcheck...
drupal@drupal:~/proyectolimpio$ ^C
Ejecutando el comando “ddev rm” podremos parar todos tus proyectos en ejecución y solucionará el error que estábamos teniendo.
drupal@drupal:~/proyectolimpio$ ddev rm
Project velnet is already stopped.
Project velnet has been stopped.
drupal@drupal:~/proyectolimpio$ ddev start
Starting proyectolimpio...
mkcert may not be properly installed, we suggest installing it for trusted https support, `brew install mkcert nss`, `choco install -y mkcert`, etc. and then `mkcert -install`
Running Command=ip address show dev docker0
Building db
Building web
Creating ddev-proyectolimpio-db ...
Creating ddev-proyectolimpio-db ... done
Creating ddev-proyectolimpio-dba ...
Creating ddev-proyectolimpio-web ...
Creating ddev-proyectolimpio-dba ... done
Creating ddev-proyectolimpio-web ... done
Creating ddev-router ...
Creating ddev-router ... done
Ensuring write permissions for proyectolimpio
Existing settings.php file includes settings.ddev.php
User-managed /home/drupal/proyectolimpio/web/sites/default/.gitignore will not be managed/overwritten by ddev
Ensuring write permissions for proyectolimpio
Successfully started proyectolimpio
Project can be reached at http://proyectolimpio.ddev.site http://127.0.0.1:49159
Como podemos observar, una vez arrancado nos asigna la url para que podamos acceder a nuestro proyecto, pero aún no hemos terminado, nosotros queremos que arranque con su propia base de datos y no con una limpia, ahora mismo estamos utilizando el código del proyecto pero no su base de datos
Podemos acceder por consola al contenedor web donde tenemos acceso a la base de datos, a el servidor nginx y el código del proyecto, para acceder podremos el siguiente comando en la raíz del proyecto.
drupal@drupal:~/proyectolimpio$ ddev ssh
drupal@proyectolimpio-web:/var/www/html$ mysql -u root -p
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 20
Server version: 10.3.28-MariaDB-1:10.3.28+maria~focal-log mariadb.org binary distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [db]> show databases;
+--------------------+
| Database |
+--------------------+
| db |
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.001 sec)
MariaDB [db]>
Como muestro en el código anterior, con la línea “ddev ssh” podemos acceder al contenedor y desde ahí tenemos acceso a la base de datos.
Metemos la base de datos del proyecto
Como dije anteriormente, ahora mismo si arrancamos el proyecto nos arrancará con una base de datos totalmente limpia, pero nosotros lo que queremos es arrancarlo con la base de datos del proyecto que estamos desplegando, para ello ejecutaremos el comando “docker ps” y nos mostrará información sobre los contenedores que tenemos arrancados en este momento, entre estas características encontramos el id del los contenedores, guardaremos el id del contenedor ssh que es el que queremos agregar la base de datos del proyecto.
Para ello nos colocaremos en el directorio donde se encuentre la base de datos e ingresamos el siguiente comando para poder copiar la base de datos dentro de nuestro contenedor.
drupal@drupal:~/alfonsoterrones.github.io$ docker cp nombre_basededatos.sql 6028edad38b3:/
Ya tendremos la base de datos dentro de nuestro contenedor, para y mediante mysqldump podremos cargar la base de datos (faltan capturas)
Ahora tendremos que indicarles en nuestro settings la nueva base de datos para que arranque el proyecto como nosotros queremos, para ello editaremos el fichero que se encuentra en la siguiente ruta “sites/default/settings.ddev.php” y editaremos las siguientes líneas.
$databases['default']['default'] = array(
'database' => "nombre_basededatos",
'username' => "root",
'password' => "root",
'host' => $host,
'driver' => "mysql",
'port' => $port,
'prefix' => "",
);
Cambiaremos tanto el nombre de la base de datos como el usuario y contraseña que ahora será ‘root’.
Y en principio debería de arrancarnos sin ningún problema no sin antes acceder de nuevo al contenedor mediante “ddev ssh” y ejecutar el comando “drush8 cr” para borrar la cache.
¡Espero que os haya funcionado igual que a mí!
Un saludo!!