21/03/2021
En el vertiginoso mundo del desarrollo de software y las operaciones, la eficiencia y la consistencia son tan cruciales como una parada en boxes perfecta en la Fórmula 1. Aquí es donde Docker entra en escena, ofreciendo un entorno aislado y reproducible para nuestras aplicaciones. Sin embargo, para que estos contenedores sean verdaderamente flexibles y adaptables a diferentes escenarios (desarrollo, pruebas, producción), necesitamos una forma de gestionar su configuración sin modificar el código fuente. La respuesta a este desafío son las variables de entorno, un mecanismo simple pero increíblemente poderoso para desacoplar la configuración del código de la aplicación.

Las variables de entorno son pares clave-valor que existen fuera del proceso de una aplicación y que esta puede leer para ajustar su comportamiento. Piense en ellas como las instrucciones que el ingeniero de carrera le da al piloto justo antes de salir a la pista: no cambian el diseño del coche, pero sí cómo se comportará en esa sesión específica. Este artículo es su guía completa para entender y dominar el uso de variables de entorno en Docker, desde los métodos más básicos hasta las mejores prácticas para garantizar la seguridad y la mantenibilidad de sus despliegues.
¿Qué son Exactamente las Variables de Entorno en Docker?
Cuando ejecutas una aplicación dentro de un contenedor Docker, esta se encuentra en un entorno completamente aislado. Esto significa que no tiene acceso directo a las variables de entorno definidas en tu shell de anfitrión (tu terminal). Las variables de entorno de Docker son, por lo tanto, valores predefinidos que se pueden pasar a una aplicación en contenedores para influir en su comportamiento sin alterar la imagen subyacente.
Esta capacidad es fundamental para la portabilidad. Permite que la misma imagen de Docker se despliegue en múltiples entornos (desarrollo, staging, producción) simplemente inyectando la configuración apropiada en tiempo de ejecución. Por ejemplo, la URL de la base de datos será diferente en cada entorno, y esto se gestiona perfectamente con una variable de entorno.
Tipos de Variables en el Ecosistema Docker
Dentro de Docker, no todas las variables son iguales. Es crucial entender sus diferencias para usarlas correctamente:
- Variables ENV: Definidas en el Dockerfile con la instrucción
ENV, estas variables persisten a través de la construcción de la imagen y están disponibles en tiempo de ejecución para cualquier contenedor que se cree a partir de esa imagen. Son ideales para establecer valores predeterminados. - Variables ARG: Definidas en el Dockerfile con la instrucción
ARG, estas son variables exclusivas para el tiempo de construcción. Se utilizan para pasar valores al proceso de build (por ejemplo, una versión específica de una dependencia), pero no están disponibles dentro del contenedor una vez que está en ejecución. - Variables de Tiempo de Ejecución: Son aquellas que se inyectan cuando se inicia el contenedor, utilizando comandos como
docker runo mediante archivos de configuración comodocker-compose.yml. Estas variables pueden anular los valores definidos conENVen el Dockerfile.
Métodos para Pasar Variables a Contenedores Docker
Existen varias técnicas para suministrar variables de entorno a sus contenedores. La elección del método dependerá del contexto, la complejidad de la aplicación y sus preferencias de flujo de trabajo.
Método 1: A través de la Línea de Comandos con `docker run`
Este es el enfoque más directo y es ideal para pruebas rápidas o para ejecutar contenedores individuales.
La Bandera `-e` o `--env`
Puedes establecer variables de entorno una por una utilizando la bandera `-e`. Puedes repetir la bandera tantas veces como necesites.
$ docker run -it -e MI_VARIABLE="un valor importante" -e API_KEY=ABC12345 alpine:latest shDentro del contenedor, puedes verificar que las variables se han establecido:
/ # echo $MI_VARIABLE un valor importante / # echo $API_KEY ABC12345Heredando Variables del Shell del Anfitrión
Si ya tienes una variable de entorno exportada en tu shell y quieres pasarla al contenedor con el mismo nombre y valor, simplemente omite el valor al usar la bandera `-e`:
$ export LOG_LEVEL=DEBUG $ docker run -it -e LOG_LEVEL alpine:latest sh / # echo $LOG_LEVEL DEBUGDocker tomará automáticamente el valor de la variable LOG_LEVEL de tu shell y la establecerá dentro del contenedor.
La Bandera `--env-file`
Para evitar una línea de comandos larga y desordenada cuando tienes muchas variables, puedes agruparlas en un archivo de entorno (comúnmente llamado .env). Este es un archivo de texto simple con pares clave-valor.
Contenido de config.env:
DB_HOST=mysql.produccion.local DB_USER=prod_user CACHE_ENABLED=trueLuego, puedes cargar este archivo al iniciar el contenedor:
$ docker run --env-file ./config.env alpine:latest envEste comando mostrará todas las variables de entorno dentro del contenedor, incluidas las que cargaste desde el archivo.
Método 2: Usando Docker Compose para Orquestación
Para aplicaciones compuestas por múltiples servicios (por ejemplo, un backend, una base de datos y un frontend), Docker Compose es la herramienta estándar. Proporciona una forma declarativa y mucho más limpia de gestionar las variables de entorno.
La Clave `environment` en `docker-compose.yml`
Dentro de la definición de un servicio en tu archivo docker-compose.yml, puedes usar la clave `environment` para listar las variables.

services: mi_api: image: mi-api:1.0 environment: - MODO_APP=produccion - DEBUG=0 - JWT_SECRET # Hereda el valor del shell anfitriónInterpolación de Variables
Docker Compose es inteligente y permite la interpolación, lo que te permite construir valores o establecer valores predeterminados si una variable no está presente en el shell.
environment: # Usa el valor de API_ENDPOINT del shell, o 'http://localhost:8080' si no está definida. - API_URL=${API_ENDPOINT:-http://localhost:8080}La Clave `env_file` en Docker Compose
De forma similar a `docker run`, puedes especificar un archivo de entorno para cargar variables para un servicio específico.
services: worker: image: mi-worker:latest env_file: - ./worker.env - ./common.env # Puedes especificar múltiples archivosUna característica muy útil de Docker Compose es que automáticamente buscará y cargará un archivo llamado .env en el mismo directorio donde ejecutas el comando docker compose up, haciendo que sus variables estén disponibles para la interpolación en el archivo `docker-compose.yml`.
Tabla Comparativa de Métodos
Para ayudarte a decidir qué método usar, aquí tienes una tabla comparativa:
| Método | Caso de Uso Principal | Ventajas | Desventajas |
|---|---|---|---|
| `docker run -e` | Pruebas rápidas, desarrollo, contenedores únicos. | Directo, rápido, no requiere archivos adicionales. | Poco práctico para muchas variables, propenso a errores, no versionable. |
| `docker run --env-file` | Contenedores únicos con configuraciones complejas. | Organizado, reutilizable, versionable. | Requiere gestionar un archivo adicional. |
| Dockerfile (`ENV`) | Establecer valores predeterminados o variables que no cambian. | La configuración viaja con la imagen, autodocumentado. | Poco flexible, requiere reconstruir la imagen para cambiar un valor. |
| Docker Compose | Aplicaciones multi-servicio, entornos de desarrollo y producción. | Declarativo, versionable, potente (interpolación), gestiona toda la pila. | Curva de aprendizaje ligeramente mayor que `docker run`. |
Mejores Prácticas para la Gestión de Variables
Usar variables de entorno es fácil, pero usarlas de forma segura y eficiente requiere seguir algunas buenas prácticas.
1. No Almacenes Secretos en Variables de Entorno
Este es el punto más crítico. Las variables de entorno no son un mecanismo seguro para almacenar datos sensibles como contraseñas, tokens de API o claves privadas. Cualquiera con acceso al host de Docker puede ejecutar `docker inspect
2. Prefiere Archivos de Configuración
Para cualquier cosa más allá de una simple prueba, evita pasar variables directamente en la línea de comandos. Usar archivos `.env` y `docker-compose.yml` hace que tu configuración sea explícita, versionable (puedes guardarla en Git, ¡pero asegúrate de que los archivos con secretos no se suban!) y mucho más fácil de gestionar y auditar.
3. Establece un Estándar de Nomenclatura
Para evitar conflictos con variables del sistema o de otras aplicaciones, adopta un prefijo consistente para las variables de tu aplicación. Por ejemplo, si tu aplicación se llama "RacerApp", todas tus variables podrían empezar con `RACERAPP_`, como `RACERAPP_DB_HOST` o `RACERAPP_PORT`.
4. Diseña tus Aplicaciones para ser Configurables
Asegúrate de que tus aplicaciones estén diseñadas desde el principio para leer su configuración de las variables de entorno. Esto las hace "nativas de la nube" y mucho más fáciles de contenedorizar y desplegar en cualquier plataforma de orquestación.
Preguntas Frecuentes (FAQ)
¿Cuál es la diferencia principal entre `ARG` y `ENV` en un Dockerfile?
ARG es una variable de tiempo de construcción (build-time). Su valor solo está disponible mientras se construye la imagen con `docker build`. No existe en el contenedor en ejecución. ENV, por otro lado, establece una variable de entorno que persiste y está disponible para cualquier proceso que se ejecute dentro del contenedor.
¿Qué pasa si defino la misma variable en múltiples lugares?
Docker sigue una clara jerarquía de precedencia. Las variables pasadas en la línea de comandos (con `docker run -e`) siempre tendrán la máxima prioridad y anularán los valores definidos en un archivo `--env-file` o los valores predeterminados establecidos con `ENV` en el Dockerfile.
¿Cómo puedo compartir una variable entre varios servicios en Docker Compose?
La forma más común es definir la variable en un archivo .env en la raíz de tu proyecto. Docker Compose cargará este archivo automáticamente, y luego puedes hacer referencia a la variable usando la sintaxis `${MI_VARIABLE}` en la sección `environment` de cada servicio que la necesite.
Si quieres conocer otros artículos parecidos a Guía Definitiva para Variables de Entorno en Docker puedes visitar la categoría Automovilismo.
