• Nuestro fichero compose.yaml se puede parametrizar. Determinados datos se pueden poner con una variable a la que daremos un valor en el momento de creación del escenario.
  • La ventaja de parametrizar el fichero compose.yaml es que nos permite, con un mismo fichero, desplegar nuestras aplicaciones en diferentes entornos. Por ejemplo, en despliegues en el entorno de desarrollo tendremos unos valores para las variables, y en el despliegue en el entorno de producción tendremos otro conjunto de valores.
  • Las variables tienen la forma de clave=valor y se guardan en un fichero llamado .env.
  • Para utilizar las variables en el fichero compose.yaml utilizaremos la sintaxis ${clave}.

Puedes encontrar los ficheros necesarios en el Repositorio con el código de los ejemplos.

Por ejemplo podríamos parametrizar el despliegue de WordPress + MariaDB utilizando las siguientes variables:

version: '3.1'
services:
  wordpress:
    container_name: servidor_wp
    image: wordpress:${VERSION_WP}
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: ${USUARIO}
      WORDPRESS_DB_PASSWORD: ${PASS}
      WORDPRESS_DB_NAME: ${BASEDEDATOS}
    ports:
      - ${PUERTO}:80
    volumes:
      - wordpress_data:/var/www/html
  db:
    container_name: servidor_mysql
    image: mariadb:${VERSION_MDB}
    restart: always
    environment:
      MARIADB_DATABASE: ${BASEDEDATOS}
      MARIADB_USER: ${USUARIO}
      MARIADB_PASSWORD: ${PASS}
      MARIADB_ROOT_PASSWORD: ${PASS_ROOT}
    volumes:
      - mariadb_data:/var/lib/mysql
volumes:
    wordpress_data:
    mariadb_data:

Como puedes observar hemos parametrizado las versiones de la imágenes (VERSION_WP y VERSION_MDB), el puerto de acceso (PUERTO) y las credenciales de acceso a la base de datos (USUARIO, PASS,PASS_ROOT y BASEDEDATOS).

Al ejecutar docker compose up se busca en el mismo directorio donde está el fichero compose.yaml un fichero llamado .env con la declaración de las variables que vamos a usar.

Despliegue de la aplicación en el entorno de desarrollo

En el entorno de desarrollo para desplegar el escenario podríamos tener un fichero .env con los siguientes valores:

VERSION_WP=latest
VERSION_MDB=latest
PUERTO=8080
USUARIO="prueba"
PASS="asdasd"
PASS_ROOT="asdasd"
BASEDEDATOS="wordpress"

Desplegamos el escenario:

$ docker compose up -d

Y podemos comprobar la configuración que hemos desplegado:

$ docker compose ps
NAME             IMAGE              COMMAND                  SERVICE     CREATED          STATUS          PORTS
servidor_mysql   mariadb:latest     "docker-entrypoint.s…"   db          15 seconds ago   Up 10 seconds   3306/tcp
servidor_wp      wordpress:latest   "docker-entrypoint.s…"   wordpress   15 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp, :::8080->80/tcp

Vemos las versiones de las imágenes que hemos desplegado (latest), el puerto que hemos mapeado (el 8080/tcp) y podemos ver las variables de entorno que se han creado, por ejemplo, en el contenedor de la base de datos:

$ docker compose exec db env
MARIADB_USER=prueba
MARIADB_PASSWORD=asdasd
MARIADB_ROOT_PASSWORD=asdasd
MARIADB_DATABASE=wordpress
...

Despliegue de la aplicación en el entorno de producción

En este caso en el fichero .env tenemos definidas las siguientes variables:

VERSION_WP=php8.3-apache
VERSION_MDB=10.5
PUERTO=80
USUARIO="user_server_1345"
PASS="0sFPBmHeDvgu5DOpACFsQ5MhH1J"
PASS_ROOT="4KUHGOa1CWciYopkAw9eBZdBtbu"
BASEDEDATOS="wp_server_bd"

Realizamos el despliegue:

$ docker compose up -d

Y podemos comprobar la configuración que hemos desplegado:

$ docker compose ps
NAME             IMAGE                     COMMAND                  SERVICE     CREATED          STATUS         PORTS
servidor_mysql   mariadb:10.5              "docker-entrypoint.s…"   db          14 seconds ago   Up 2 seconds   3306/tcp
servidor_wp      wordpress:php8.3-apache   "docker-entrypoint.s…"   wordpress   14 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp

Vemos las versiones de las imágenes que hemos desplegado (mariadb:10.5 y wordpress:php8.3-apache), el puerto que hemos mapeado (el 80/tcp) y podemos ver las variables de entorno que se han creado, por ejemplo, en el contenedor de la base de datos:

$ docker compose exec db env
MARIADB_USER=user_server_1345
MARIADB_PASSWORD=0sFPBmHeDvgu5DOpACFsQ5MhH1J
MARIADB_ROOT_PASSWORD=4KUHGOa1CWciYopkAw9eBZdBtbu
MARIADB_DATABASE=wp_server_bd
...

Actualizado: