How do I manage environment variables in Docker?

La gestión de variables de entorno en Docker se puede realizar utilizando la opción `-e` en `docker run`, o definiéndolas en un archivo `.env` o en `docker-compose.yml`, asegurando una configuración segura.
Índice
Cómo gestionar variables de entorno en DockerLas variables de entorno son una forma de pasar información dinámica a los contenedores Docker. Permiten configurar aplicaciones sin modificar el código fuente. Aquí te explico las principales formas de gestionarlas:1. Usando la opción -e al ejecutar un contenedor:   docker run -e VAR1=valor1 -e VAR2=valor2 imagen2. Mediante un archivo .env:   - Crear un archivo con extensión .env   - Añadir las variables en formato VAR=valor   - Usar --env-file al ejecutar el contenedor:     docker run --env-file=.env imagen3. En el Dockerfile:   - Usar la instrucción ENV para definir variables por defecto   - Ejemplo: ENV VAR1=valor1 VAR2=valor24. Con docker-compose.yml:   - Definir variables en la sección environment   - Ejemplo:     environment:       - VAR1       - VAR2=valor25. Usando secretos y configmaps en Docker Swarm:   - Para información sensible, usar docker secret create   - Para configuración, usar docker config create6. Variables de entorno en tiempo de ejecución:   - Sobrescribir variables definidas en la imagen   - Útil para diferentes entornos (desarrollo, producción, etc.)7. Validación de variables:   - Usar herramientas como docker-compose config para verificar   - Asegurar que todas las variables requeridas estén definidas8. Variables de entorno en imágenes base:   - Algunas imágenes oficiales ya definen variables útiles   - Consultar la documentación de cada imagen9. Gestión de variables en CI/CD:   - Integrar la gestión de variables en pipelines de despliegue   - Usar variables de entorno del sistema CI/CD10. Buenas prácticas:    - No incluir información sensible en imágenes o repositorios    - Usar nombres descriptivos para las variables    - Documentar las variables requeridas por la aplicación11. Variables de entorno en Kubernetes:    - Similar a Docker, pero con ConfigMaps y Secrets    - Permite una gestión más avanzada en entornos orquestados12. Herramientas de gestión:    - HashiCorp Vault para gestión centralizada de secretos    - External secrets operator para Kubernetes13. Variables de entorno en desarrollo local:    - Usar herramientas como direnv o autoenv    - Facilita el cambio entre diferentes proyectos14. Variables de entorno en testing:    - Usar diferentes conjuntos de variables para distintos escenarios    - Automatizar la configuración en entornos de testing15. Variables de entorno en producción:    - Usar herramientas de gestión de configuración    - Implementar rotación de secretos y variables sensiblesLa gestión adecuada de variables de entorno es crucial para la seguridad y flexibilidad de tus aplicaciones en contenedores Docker. Permite una configuración dinámica y segura sin modificar el código fuente.

Gestión de variables de entorno en Docker: Una guía avanzadaLas variables de entorno son un aspecto fundamental de la gestión de aplicaciones en contenedores Docker. Permiten configurar dinámicamente el comportamiento de las aplicaciones sin modificar el código fuente. En esta guía avanzada, exploraremos técnicas y mejores prácticas para gestionar variables de entorno en Docker de manera eficiente y segura.1. Variables de entorno básicasLa forma más simple de establecer variables de entorno en Docker es mediante la opción -e o --env al ejecutar un contenedor:```bash docker run -e VAR1=valor1 -e VAR2=valor2 imagen ```También puedes usar un archivo .env:```bash docker run --env-file=.env imagen ```2. Variables de entorno en Docker ComposeDocker Compose permite definir variables de entorno en el archivo docker-compose.yml:```yaml version: '3.8' services: app: image: mi-imagen environment: - VAR1=valor1 - VAR2=valor2 ```3. Variables de entorno desde el hostPuedes pasar variables de entorno del host al contenedor:```bash docker run -e VAR=$VAR_HOST imagen ```O en Docker Compose:```yaml environment: - VAR=${VAR_HOST} ```4. Variables de entorno por defectoPara establecer valores por defecto si una variable no está definida:```bash docker run -e VAR=${VAR:-valor_por_defecto} imagen ```5. Variables de entorno secretasPara manejar información sensible, utiliza Docker secrets:```bash echo "secreto" | docker secret create mi_secreto - docker service create --secret mi_secreto imagen ```6. Variables de entorno en tiempo de compilaciónEn Dockerfiles, puedes usar ARG para variables en tiempo de compilación:```dockerfile ARG VERSION=1.0 RUN echo "Compilando versión $VERSION" ```7. Variables de entorno dinámicasPara generar variables de entorno dinámicamente, puedes usar scripts de entrada:```bash #!/bin/bash export VAR=$(generate_value) exec "$@" ```8. Variables de entorno en múltiples serviciosPara compartir variables entre servicios en Docker Compose, define una variable en el archivo .env:```bash VAR_COMPARTIDA=valor ```Luego úsala en docker-compose.yml:```yaml services: app1: environment: - VAR=${VAR_COMPARTIDA} app2: environment: - VAR=${VAR_COMPARTIDA} ```9. Variables de entorno para configuración de redPara configurar la red de un contenedor:```bash docker run -e "SERVICE_PORTS=80,443" imagen ```10. Variables de entorno para personalización de aplicacionesPermite a los usuarios personalizar el comportamiento de la aplicación:```bash docker run -e "APP_MODE=production" imagen ```11. Variables de entorno para integración continuaEn pipelines de CI/CD, usa variables de entorno para diferentes entornos:```bash docker build --build-arg ENV=$CI_ENVIRONMENT_TAG -t mi-imagen:$CI_COMMIT_SHA . ```12. Variables de entorno para multi-arquitecturaPara construir imágenes multi-arquitectura:```bash docker buildx build --platform linux/amd64,linux/arm64 -t mi-imagen . ```13. Variables de entorno para optimización de rendimientoAjusta el rendimiento de la aplicación mediante variables de entorno:```bash docker run -e "JVM_HEAP_SIZE=2G" imagen-java ```14. Variables de entorno para depuraciónFacilita la depuración con variables de entorno:```bash docker run -e "DEBUG=true" -e "LOG_LEVEL=DEBUG" imagen ```15. Variables de entorno para seguridadMejora la seguridad configurando variables de entorno:```bash docker run -e "DISABLE_PASSWORDS=true" imagen ```16. Variables de entorno para internacionalizaciónAdapta tu aplicación a diferentes idiomas y regiones:```bash docker run -e "LANG=es_ES.UTF-8" imagen ```17. Variables de entorno para personalización de recursosControla el uso de recursos mediante variables de entorno:```bash docker run -e "MAX_CONNECTIONS=100" imagen ```18. Variables de entorno para integración con servicios externosConfigura conexiones a servicios externos:```bash docker run -e "DB_HOST=db.example.com" -e "DB_PORT=5432" imagen ```19. Variables de entorno para versionadoGestiona diferentes versiones de tu aplicación:```bash docker run -e "APP_VERSION=2.0.1" imagen ```20. Variables de entorno para tolerancia a fallosMejora la resiliencia de tu aplicación:```bash docker run -e "RETRY_ATTEMPTS=3" -e "TIMEOUT=30s" imagen ```ConclusiónLa gestión efectiva de variables de entorno en Docker es crucial para crear aplicaciones contenerizadas flexibles, seguras y fáciles de mantener. Al dominar estas técnicas avanzadas, podrás optimizar tus despliegues de Docker y mejorar significativamente la gestión de tu infraestructura de aplicaciones.

Docker ha revolucionado la forma en que implementamos aplicaciones, ofreciendo una alternativa ligera y portable a los entornos tradicionales basados en máquinas virtuales. Uno de los conceptos clave en Docker es el uso de variables de entorno, las cuales juegan un papel fundamental en la configuración de contenedores durante su ejecución. Este artículo tiene como objetivo ofrecer una comprensión profunda de cómo gestionar variables de entorno en Docker, explorando varios métodos, buenas prácticas y errores comunes.

¿Qué son las variables de entorno?

Las variables de entorno son valores que pueden cambiar e influyen en el comportamiento de los procesos en ejecución en una computadora. Se utilizan comúnmente para configurar aplicaciones, definir ajustes para servicios y transmitir información sensible como claves API y contraseñas. En el contexto de Docker, las variables de entorno permiten personalizar el comportamiento de las aplicaciones en contenedores sin necesidad de codificar de forma rígida los valores de configuración en las imágenes.

¿Por qué usar variables de entorno en Docker?Las variables de entorno son una herramienta poderosa para configurar y personalizar el comportamiento de tus contenedores Docker. Aquí hay algunas razones clave por las que deberías considerar usarlas:1. **Flexibilidad y portabilidad**: Las variables de entorno te permiten cambiar la configuración de un contenedor sin modificar la imagen Docker. Esto significa que puedes usar la misma imagen en diferentes entornos (desarrollo, pruebas, producción) simplemente cambiando las variables de entorno.2. **Seguridad**: Las variables de entorno son una forma segura de almacenar información sensible como contraseñas, claves API o tokens de acceso. No necesitas codificar estos valores en tu código o imagen Docker, lo que reduce el riesgo de exposición.3. **Separación de preocupaciones**: Las variables de entorno te permiten separar la configuración de la aplicación del código. Esto facilita la gestión y el mantenimiento de tu aplicación, ya que puedes cambiar la configuración sin modificar el código fuente.4. **Escalabilidad**: Cuando necesitas escalar tu aplicación, las variables de entorno te permiten configurar cada instancia de contenedor de manera diferente. Esto es especialmente útil en entornos de orquestación como Kubernetes.5. **Facilidad de uso**: Las variables de entorno son fáciles de usar y entender. Puedes establecerlas al ejecutar un contenedor con la opción `-e` o en un archivo `docker-compose.yml`.6. **Integración con herramientas**: Muchas herramientas y servicios de terceros utilizan variables de entorno para la configuración. Al usar variables de entorno en tus contenedores Docker, facilitas la integración con estas herramientas.7. **Documentación**: Las variables de entorno sirven como una forma de documentar la configuración de tu aplicación. Al revisar las variables de entorno, puedes entender rápidamente cómo se configura y se comporta tu aplicación.8. **Pruebas**: Las variables de entorno facilitan las pruebas de tu aplicación en diferentes escenarios. Puedes cambiar las variables de entorno para simular diferentes condiciones y probar cómo se comporta tu aplicación.9. **Cumplimiento normativo**: En algunos casos, las variables de entorno pueden ayudarte a cumplir con ciertos requisitos normativos, como la separación de datos sensibles de la aplicación.10. **Depuración**: Las variables de entorno pueden ser útiles para la depuración. Puedes establecer variables de entorno para habilitar el modo de depuración o para mostrar información adicional durante la ejecución.En resumen, las variables de entorno son una herramienta esencial para la configuración y personalización de contenedores Docker. Proporcionan flexibilidad, seguridad y facilidad de uso, lo que las convierte en una opción popular para los desarrolladores y administradores de sistemas.

  1. Separación de ResponsabilidadesAl utilizar variables de entorno, puedes separar el código de tu aplicación de su configuración. Esto promueve una mejor mantenibilidad y escalabilidad.

  2. SeguridadLa información sensible se puede pasar a los contenedores como variables de entorno, reduciendo el riesgo de exponerla en su código base.

  3. Flexibilidad: Environment variables allow you to easily adjust the configuration of containers at runtime. For instance, you can run the same image in different environments (development, testing, production) with varying settings.

  4. Portabilidad: Since environment variables are defined at runtime, the same Docker image can be used across different systems without modification.

How to Set Environment Variables in Docker

1. Dockerfile

Puedes definir variables de entorno directamente en tu Dockerfile utilizando el entorno instruction. This is particularly useful for setting default values.

# Dockerfile de ejemplo
FROM python:3.8-slim

# Establecer variables de entorno
ENV APP_ENV=production
ENV DB_HOST=db.example.com

# Copiar el código de la aplicación
COPY . /app

# Establecer el directorio de trabajo
WORKDIR /app

# Instalar dependencias
RUN pip install -r requirements.txt

# Comando para ejecutar la aplicación
CMD ["python", "app.py"]

In this example, APP_ENTORNO and DB_HOST se establecen como variables de entorno que pueden ser accedidas por su aplicación durante el tiempo de ejecución.

2. Comando Docker Run

You can also pass environment variables at the time of container creation using the -e or --env flag with the docker run comando.

docker run -e APP_ENV=development -e DB_HOST=db.local my_image

Este enfoque permite anular los valores establecidos en el Dockerfile.

3. Environment File

For managing multiple environment variables, you can create an .env file and use the --env-file option with docker run.

# .env file
APP_ENV=production
DB_HOST=db.example.com
API_KEY=mysecretapikey

Para ejecutar el contenedor con este archivo de entorno:

docker run --env-file .env my_image

4. Docker Compose

Docker Compose simplifies the process of defining and running multi-container Docker applications. You can specify environment variables directly in the docker-compose.yml archivo.

version: '3.8'

servicios:
  web:
    imagen: my_image
    entorno:
      APP_ENV: producción
      DB_HOST: db.example.com
    puertos:
      - "5000:5000"

Alternativamente, puede hacer referencia a un archivo externo .env file:

versión: '3.8'

servicios:
  web:
    imagen: my_image
    archivo_env:
      - .env
    puertos:
      - "5000:5000"

Buenas Prácticas para la Gestión de Variables de Entorno

While environment variables are powerful, it’s essential to manage them correctly to ensure security, maintainability, and ease of use. Here are some best practices:

1. Utilice valores predeterminados

When defining environment variables in your Dockerfile, consider providing default values. This ensures that your application has a fallback in case no value is provided at runtime.

2. Keep Sensitive Data Secure

Evita el hardcoding de datos sensibles como contraseñas o claves API en tu Dockerfile o base de código. En su lugar, utilice variables de entorno pasadas en tiempo de ejecución o aproveche los secretos de Docker para información sensible en plataformas de orquestación como Docker Swarm.

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.

Mantén un archivo de documentación bien mantenido que describa cada variable de entorno, su propósito y sus posibles valores. Esto es especialmente importante para proyectos en equipo.

4. Use Meaningful Names

Las convenciones de nomenclatura son importantes. Utilice nombres claros y descriptivos para sus variables de entorno. Esto ayuda a los desarrolladores a comprender la configuración sin tener que revisar el código.

5. Limit Variable Scope

Whenever possible, limit the scope of environment variables to the services that require them. This practice helps to minimize potential security risks associated with exposing sensitive configuration details to unnecessary services.

Common Pitfalls

  1. Sobreescribir VariablesTen cuidado al pasar variables de entorno en tiempo de ejecución. Si configuras una variable tanto en tu Dockerfile and your docker run comando, este último tendrá prioridad, lo que podría generar un comportamiento inesperado si no se gestiona con cuidado.

  2. Usando valores no stringLas variables de entorno de Docker siempre se tratan como cadenas. Si tu aplicación espera un tipo diferente (como un booleano o un entero), asegúrate de realizar la conversión apropiada en el código de tu aplicación.

  3. Ignorando el desarrollo local: Local development and testing should mimic production as closely as possible. To achieve this, use the same environment variable configuration (e.g., through .env files) to ensure consistency.

  4. Not Utilizing Docker SecretsPara datos sensibles, considera usar secretos de Docker en su lugar, especialmente si estás desplegando en modo enjambre. Los secretos están cifrados y solo están disponibles para los servicios que los necesitan explícitamente.

Accessing Environment Variables in Application Code

Una vez configuradas las variables de entorno, acceder a ellas desde el código de tu aplicación es sencillo. La mayoría de los lenguajes de programación proporcionan bibliotecas integradas para leer variables de entorno.

Acceso en Python

import os

app_env = os.getenv('APP_ENV', 'development')
db_host = os.getenv('DB_HOST', 'localhost')

print(f'Entorno de la aplicación: {app_env}')
print(f'Host de la base de datos: {db_host}')

Acceso en Node.jsEn Node.js, el acceso a los datos se realiza a través de módulos y paquetes. Los módulos son archivos JavaScript que exportan funciones, objetos o primitivos que pueden ser utilizados por otros programas. Los paquetes son colecciones de módulos que se pueden instalar y utilizar en un proyecto.Para acceder a un módulo en Node.js, se utiliza la función require(). Esta función toma como argumento el nombre del módulo que se desea importar y devuelve el objeto exportado por ese módulo. Por ejemplo, para importar el módulo 'fs' (file system) que permite trabajar con archivos, se utiliza la siguiente línea de código:```javascript const fs = require('fs'); ```Una vez importado el módulo, se pueden utilizar sus funciones y propiedades. Por ejemplo, para leer el contenido de un archivo, se puede utilizar la función readFile() del módulo 'fs':```javascript fs.readFile('archivo.txt', 'utf8', (err, data) => { if (err) { console.error(err); } else { console.log(data); } }); ```En este ejemplo, se lee el contenido del archivo 'archivo.txt' en formato UTF-8 y se imprime en la consola. Si ocurre un error durante la lectura del archivo, se imprime el error en la consola.Además de los módulos nativos de Node.js, también se pueden instalar y utilizar paquetes de terceros a través del gestor de paquetes npm (Node Package Manager). Para instalar un paquete, se utiliza el comando npm install seguido del nombre del paquete. Por ejemplo, para instalar el paquete 'express' que permite crear servidores web, se utiliza el siguiente comando:``` npm install express ```Una vez instalado el paquete, se puede importar y utilizar en el código de la misma manera que un módulo nativo. Por ejemplo, para crear un servidor web con express, se puede utilizar el siguiente código:```javascript const express = require('express'); const app = express();app.get('/', (req, res) => { res.send('Hola mundo'); });app.listen(3000, () => { console.log('Servidor escuchando en el puerto 3000'); }); ```En este ejemplo, se crea una aplicación express y se define una ruta para la URL raíz ('/') que envía la respuesta 'Hola mundo'. Luego, se inicia el servidor en el puerto 3000 y se imprime un mensaje en la consola indicando que el servidor está escuchando.En resumen, el acceso a los datos en Node.js se realiza a través de módulos y paquetes. Los módulos se importan utilizando la función require() y los paquetes se instalan y utilizan a través del gestor de paquetes npm. Con estos recursos, se pueden realizar diversas tareas, como leer y escribir archivos, crear servidores web, conectarse a bases de datos, entre otros.

const appEnv = process.env.APP_ENV || 'desarrollo';
const dbHost = process.env.DB_HOST || 'localhost';

console.log(`Entorno de la aplicación: ${appEnv}`);
console.log(`Host de la base de datos: ${dbHost}`);

Accessing in Java

public class Main {
    public static void main(String[] args) {
        String appEnv = System.getenv("APP_ENV");
        String dbHost = System.getenv("DB_HOST");

        System.out.println("Entorno de la aplicación: " + (appEnv != null ? appEnv : "development"));
        System.out.println("Host de la base de datos: " + (dbHost != null ? dbHost : "localhost"));
    }
}

Conclusión

Environment variables are a powerful feature in Docker that facilitates flexible, secure, and maintainable application configuration. By mastering the various methods for managing environment variables and adhering to best practices, you can enhance your development workflow and ensure that your applications are robust and adaptable.

Al igual que con cualquier herramienta, comprender las fortalezas y limitaciones de las variables de entorno te permitirá construir mejores aplicaciones contenerizadas. Ya sea que estés desplegando un simple servicio web o una compleja arquitectura de microservicios, la gestión efectiva de las variables de entorno será un componente clave para tu éxito en el ecosistema Docker.