Docker Compose Environment Variables

Docker Compose allows the use of environment variables to configure services dynamically. By defining variables in a `.env` file or directly in `docker-compose.yml`, users can customize settings without hardcoding values, enhancing portability and security.
Índice
Variables de entorno en docker-composeEn este ejemplo, vamos a crear un archivo docker-compose.yml que utilice variables de entorno para configurar una aplicación web simple.Paso 1: Crear el archivo docker-compose.ymlCrea un archivo llamado docker-compose.yml con el siguiente contenido:```yamlversion: '3.8'services:  web:    image: nginx:latest    ports:      - "${NGINX_PORT}:80"    environment:      - NGINX_HOST=${NGINX_HOST}    volumes:      - ./nginx.conf:/etc/nginx/nginx.conf```En este archivo, estamos utilizando dos variables de entorno:- `NGINX_PORT`: Se utiliza para configurar el puerto en el que se expondrá el contenedor de Nginx.- `NGINX_HOST`: Se utiliza para configurar el nombre de host del servidor Nginx.Paso 2: Crear el archivo de configuración de NginxCrea un archivo llamado nginx.conf con el siguiente contenido:```nginxevents {    worker_connections 1024;}http {    server {        listen 80;        server_name ${NGINX_HOST};        location / {            root /usr/share/nginx/html;            index index.html index.htm;        }    }}```En este archivo, estamos utilizando la variable de entorno `NGINX_HOST` para configurar el nombre de host del servidor Nginx.Paso 3: Crear el archivo .envCrea un archivo llamado .env con el siguiente contenido:```NGINX_PORT=8080NGINX_HOST=localhost```En este archivo, estamos definiendo los valores de las variables de entorno que utilizaremos en el archivo docker-compose.yml y nginx.conf.Paso 4: Iniciar los contenedoresEjecuta el siguiente comando para iniciar los contenedores:```docker-compose up -d```Este comando iniciará un contenedor de Nginx utilizando la imagen nginx:latest y configurará el puerto y el nombre de host según las variables de entorno definidas en el archivo .env.Paso 5: Probar la aplicaciónAbre un navegador web y navega a http://localhost:8080. Deberías ver la página de bienvenida de Nginx.¡Enhorabuena! Has creado un archivo docker-compose.yml que utiliza variables de entorno para configurar una aplicación web simple.

Understanding Docker Compose Environment Variables

Docker Compose es una herramienta eficaz que simplifica la gestión de aplicaciones Docker multi-contenedor. En esencia, permite a los desarrolladores definir los servicios, redes y volúmenes que requieren sus aplicaciones en un solo archivo. docker-compose.yml archivo. Una de las características más cruciales de Docker Compose es la capacidad de utilizar variables de entorno, lo que puede mejorar la flexibilidad, seguridad y reutilización de tu configuración. Este artículo profundizará en los diversos aspectos de las variables de entorno de Docker Compose, explicando su propósito, uso y mejores prácticas.

What are Environment Variables?

Las variables de entorno son valores dinámicos que pueden afectar el comportamiento de los procesos en una computadora. Se utilizan frecuentemente para pasar información de configuración a las aplicaciones, permitiendo a los desarrolladores evitar codificar valores directamente en su código. En el contexto de Docker y Docker Compose, las variables de entorno pueden emplearse para definir configuraciones como cadenas de conexión a bases de datos, claves API y otra información sensible que no debería estar incrustada en el código fuente.

¿Por qué utilizar variables de entorno con Docker Compose?Las variables de entorno son una herramienta poderosa para configurar y personalizar el comportamiento de tus aplicaciones y servicios en Docker Compose. Algunas de las razones clave para utilizar variables de entorno son:1. **Flexibilidad y portabilidad**: Las variables de entorno te permiten definir valores que pueden cambiar entre diferentes entornos, como desarrollo, pruebas y producción. Esto hace que tus archivos de configuración sean más flexibles y portátiles, ya que puedes reutilizarlos en diferentes contextos sin tener que modificarlos.2. **Seguridad**: Las variables de entorno son una forma segura de almacenar información sensible, como contraseñas, claves de API y tokens de acceso. En lugar de codificar estos valores directamente en tus archivos de configuración, puedes definirlos como variables de entorno y mantenerlos fuera del control de versiones.3. **Configuración dinámica**: Las variables de entorno te permiten configurar dinámicamente el comportamiento de tus servicios en tiempo de ejecución. Por ejemplo, puedes utilizar variables de entorno para establecer el nivel de registro, la ubicación de los archivos de configuración o las conexiones de base de datos.4. **Integración con herramientas externas**: Muchas herramientas y servicios externos, como bases de datos, sistemas de mensajería y proveedores de nube, utilizan variables de entorno para la configuración. Al utilizar variables de entorno en tus archivos de Docker Compose, puedes integrar fácilmente tus servicios con estas herramientas externas.5. **Facilidad de uso**: Las variables de entorno son fáciles de usar y entender. Puedes definirlas en tus archivos de Docker Compose utilizando la sintaxis estándar de YAML, y luego acceder a ellas en tus aplicaciones utilizando el lenguaje de programación o el framework que estés utilizando.En resumen, las variables de entorno son una herramienta esencial para configurar y personalizar tus aplicaciones y servicios en Docker Compose. Proporcionan flexibilidad, seguridad, configuración dinámica, integración con herramientas externas y facilidad de uso, lo que las convierte en una opción ideal para gestionar la configuración de tus servicios en contenedores.

El uso de variables de entorno con Docker Compose facilita un enfoque más modular para la gestión de configuraciones. Estos son algunos de los beneficios clave:1. **Flexibilidad**: Las variables de entorno permiten personalizar la configuración de los servicios sin modificar los archivos de configuración base. Esto es especialmente útil en entornos de desarrollo, pruebas y producción, donde los valores pueden variar.2. **Seguridad**: Almacenar información sensible, como contraseñas o claves de API, en variables de entorno en lugar de en archivos de configuración ayuda a mantener la seguridad. Las variables de entorno pueden ser gestionadas de forma segura y no se exponen en el código fuente.3. **Reutilización**: Las variables de entorno facilitan la reutilización de archivos de configuración en diferentes entornos. Por ejemplo, un mismo archivo `docker-compose.yml` puede utilizarse en desarrollo, pruebas y producción, simplemente cambiando las variables de entorno.4. **Gestión de configuraciones**: Las variables de entorno permiten gestionar configuraciones de forma centralizada. Esto simplifica la administración de múltiples servicios y entornos, ya que los cambios se pueden realizar en un solo lugar.5. **Integración con herramientas de CI/CD**: Las variables de entorno son compatibles con herramientas de integración continua y despliegue continuo (CI/CD), lo que facilita la automatización de procesos de despliegue y pruebas.6. **Escalabilidad**: Al utilizar variables de entorno, es más fácil escalar aplicaciones y servicios. Los valores de configuración pueden ajustarse dinámicamente sin necesidad de reconstruir imágenes o modificar archivos de configuración.7. **Documentación**: Las variables de entorno pueden servir como documentación implícita, indicando qué configuraciones son necesarias para que un servicio funcione correctamente. Esto ayuda a los desarrolladores a entender y configurar los servicios de manera adecuada.En resumen, el uso de variables de entorno con Docker Compose mejora la flexibilidad, seguridad, reutilización y gestión de configuraciones, lo que conduce a un desarrollo y despliegue más eficientes y seguros de aplicaciones en contenedores.

  1. Separación de ResponsabilidadesLas variables de entorno te permiten separar el código de tu aplicación de su configuración. Esto significa que puedes modificar cómo se ejecuta tu aplicación sin alterar la base de código subyacente.

  2. Seguridad: Storing sensitive information, such as passwords and API keys, as environment variables keeps them out of your source code repository, reducing the risk of accidental exposure.

  3. Flexibilidad: You can easily change configuration settings depending on the environment (development, testing, production) without modifying your application code.

  4. Simplicity: Managing settings through environment variables can simplify the deployment and orchestration of multi-container applications.

Definición de variables de entorno en Docker Compose

Docker Compose permite definir variables de entorno de varias formas. A continuación se muestran los métodos más comunes:

1. Utilizando la sección Environment

La forma más sencilla de definir variables de entorno es mediante el uso de entorno ingresa tu docker-compose.yml archivo.

versión: '3.8'

servicios:
  web:
    imagen: my-web-app
    variables_de_entorno:
      - NODE_ENV=producción
      - API_KEY=tu_api_key_aquí

En este ejemplo, se utilizan dos variables de entorno, NODE_ENV and CLAVE_API, se definen para el web servicio.

2. Using an .env Archivo

Un enfoque más organizado para gestionar las variables de entorno es utilizar un .env file. Docker Compose automatically reads this file and loads the key-value pairs as environment variables.

Create a file named .env:

NODE_ENV=producción
API_KEY=tu_api_key_aquí

Luego, haga referencia a las variables en su docker-compose.yml:

version: '3.8'

services:
  web:
    image: my-web-app
    environment:
      - NODE_ENV=${NODE_ENV}
      - API_KEY=${API_KEY}

Este método mejora la legibilidad y el mantenimiento, ya que puedes gestionar las variables de entorno en un archivo dedicado.

3. Using Shell Environment Variables

You can also pass environment variables from your shell directly to the Docker Compose command:

export NODE_ENV=production
export API_KEY=tu_clave_api_aquí
docker-compose up

En este caso, se hace referencia a las variables en el docker-compose.yml as you would normally.

4. Sustitución de variables

Docker Compose admite la sustitución de variables en el docker-compose.yml archivo. Las variables se pueden definir en el .env archivo o directamente en la shell, y puedes usarlas a lo largo del archivo.

versión: '3.8'

servicios:
  web:
    imagen: mi-app-web
    entorno:
      - NODE_ENV=${NODE_ENV:-desarrollo}
      - API_KEY=${API_KEY}

In this example, if NODE_ENV Si no se establece, se establecerá de forma predeterminada en development.

Best Practices for Using Environment Variables

While using environment variables can greatly enhance your Docker Compose configurations, there are several best practices to keep in mind:

1. Avoid Hardcoding Sensitive Information

Mantén la información sensible fuera de tu docker-compose.yml archivo. Utiliza .env archivos o soluciones de gestión de secretos como AWS Secrets Manager, HashiCorp Vault o Docker Secrets para gestionar datos sensibles de forma segura.

2. Utiliza nombres descriptivos

Elige nombres claros y descriptivos para tus variables de entorno. Esto hace que tu configuración sea más comprensible y fácil de mantener.

3. Documenta tus variables de entornoEs importante documentar las variables de entorno que utilizas en tu proyecto. Esto ayudará a otros desarrolladores a entender cómo configurar y ejecutar tu aplicación. Puedes crear un archivo de documentación en tu repositorio de código que explique qué variables de entorno se necesitan y cómo configurarlas.

Include documentation that outlines what each environment variable does, especially if you are working in a team. This can be done within the .env como comentarios o en documentación separada.

4. Use Default Values Wisely

Al utilizar la sustitución de variables, considere establecer valores por defecto para garantizar que su aplicación cuente con valores de respaldo razonables si no se proporcionan las variables de entorno.

5. Keep Your .env Files Secure

Since .env files can contain sensitive information, ensure they are not included in your version control system. Use a .gitignore archivo para excluirlos de tu repositorio Git.

Advanced Usage of Environment Variables

1. Combinando Variables de Entorno con Secretos de DockerEn el mundo de la contenerización, es común necesitar configurar aplicaciones con datos sensibles como contraseñas, claves API o tokens de autenticación. Docker proporciona una solución robusta para manejar estos secretos de forma segura: los Docker Secrets.Los Docker Secrets son una característica diseñada específicamente para gestionar información confidencial en entornos Docker. Permiten almacenar datos sensibles de forma segura y acceder a ellos solo por los servicios que los necesitan. Esto es especialmente útil en entornos de producción donde la seguridad es primordial.Para combinar variables de entorno con Docker Secrets, puedes seguir estos pasos:1. Crear un secreto en Docker: ``` echo "mi_password_secreta" | docker secret create mi_password - ```2. Asignar el secreto a un servicio: ``` docker service create --name mi_servicio --secret mi_password mi_imagen ```3. En tu aplicación, leer el secreto desde el archivo en `/run/secrets/`: ```python with open('/run/secrets/mi_password', 'r') as f: password = f.read().strip() ```4. Para variables de entorno no sensibles, puedes usar la opción `--env` o `-e`: ``` docker service create --name mi_servicio --secret mi_password -e MI_VARIABLE_NO_SENSIBLE=valor mi_imagen ```5. En tu aplicación, acceder a la variable de entorno: ```python import os variable_no_sensible = os.getenv('MI_VARIABLE_NO_SENSIBLE') ```Esta combinación te permite mantener tus secretos seguros mientras sigues utilizando variables de entorno para configuraciones no sensibles. Es una práctica recomendada en el desarrollo de aplicaciones contenerizadas, ya que separa la configuración de la aplicación del código y mantiene la información sensible fuera del código fuente y de las imágenes Docker.Recuerda que los Docker Secrets solo están disponibles en Docker Swarm, no en Docker Compose para desarrollo local. Para entornos de desarrollo, considera usar archivos .env o variables de entorno del sistema operativo anfitrión.

Para una mayor seguridad, especialmente en entornos de producción, es recomendable combinar las variables de entorno con los Secretos de Docker. Los Secretos de Docker están diseñados para almacenar y gestionar de forma segura datos sensibles, como contraseñas y claves API.

To use Docker Secrets, first create a secret:

echo "tu_api_key_aqui" | docker secret create api_key -

Then, reference the secret in your docker-compose.yml:

version: '3.8'

services:
  web:
    image: my-web-app
    secrets:
      - api_key

secrets:
  api_key:
    external: true

Dentro de tu contenedor, el secreto estará disponible en el /run/secrets/api_key archivo.

2. Environment Variables for Multi-Stage Builds

When using Docker multi-stage builds, environment variables can also be utilized to control the build context. Here’s an example:

# syntax=docker/dockerfile:1

FROM node:14 AS build

ARG NODE_ENV
ENV NODE_ENV=${NODE_ENV}

WORKDIR /app
COPY . .

RUN npm install
RUN npm run build

FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

En este caso, puede especificar el NODE_ENV variable en tiempo de compilación:

docker build --build-arg NODE_ENV=production -t mi-aplicacion-web .

3. Herramientas de Gestión de Configuración

For more complex applications, consider using configuration management tools like Docker Configs or using orchestration tools like Kubernetes ConfigMaps and Secrets. These tools allow you to manage environment variables across multiple deployments seamlessly.

Variables de entorno de depuración

Debugging environment variables in Docker Compose can be challenging. Here are some strategies:

1. Inspeccionando Contenedores en Ejecución

You can inspect running containers to view their environment variables:

docker exec -it  env

Este comando mostrará todas las variables de entorno definidas en el contenedor especificado.

2. Using docker-compose config

This command shows the final configuration of your Compose file after resolving environment variables:

docker-compose config

Es una excelente manera de confirmar que tus variables se están cargando correctamente.

3. Logging Environment Variables

Puedes agregar un comando de logging temporal a tu Dockerfile para imprimir las variables de entorno durante el proceso de construcción o inicio.

CMD ["sh", "-c", "env && exec tu_app"]

Conclusión

Environment variables in Docker Compose play a pivotal role in configuring applications in a flexible and secure manner. By understanding how to define, manage, and utilize these variables effectively, developers can ensure that their multi-container applications are both robust and adaptable to various environments. By following best practices and leveraging advanced techniques such as Docker Secrets, you can enhance the security and maintainability of your Docker deployments.

A medida que continúas trabajando con Docker Compose, ten en cuenta cómo las variables de entorno pueden optimizar tu flujo de trabajo y mejorar la arquitectura de tu aplicación. Con una planificación y ejecución cuidadosas, las variables de entorno pueden contribuir significativamente a la eficiencia y seguridad general de tus aplicaciones basadas en Docker.