Variables de Entorno y Argumentos en Docker
Tanto las variables de entorno como los argumentos son formas de configurar y personalizar la ejecución de contenedores en Docker, pero se utilizan de manera ligeramente diferente y tienen diferentes aplicaciones.
En general podemos decir que las variables de entorno son accesibles dentro del contenedor mientras que los argumentos son accesibles solo en tiempo de construcción del contenedor o build time.
Variables de Entorno
Las variables de entorno se usan para definir valores que están disponibles para los procesos que se ejecutan dentro del contenedor. Estas variables se definen al construir una imagen o al ejecutar un contenedor.
FROM ubuntu:20.04
ENV MY_VARIABLE="valor_por_defecto"
CMD echo $MY_VARIABLE
Al construir y ejecutar este Dockerfile, imprimirá valor_por_defecto.
Variables en línea
Puedes pasar variables de entorno al ejecutar un contenedor. Si la variable existe en el Dockerfile será reemplazada.
docker run <imagen> -e MY_VARIABLE="nuevo_valor"
Esto funciona de manera similar con docker compose.
version: '3.9'
services:
web:
build: .
environment:
- DEBUG_MODE=true
Variables de host
También es posible pasar variables de entorno del host a un contenedor usando el parámetro -e
sin especificar un valor:
export HOST_VARIABLE="valor_host"
docker run -e HOST_VARIABLE <imagen>
Esto funciona de manera similar con docker compose.
version: '3.9'
services:
web:
build: .
environment:
- DEBUG_MODE # sin valor por defecto, toma el valor del host o envfile
Variables en archivos
Así mismo es posible utilizar un archivo de variables de entorno.
docker run --env-file env.list <imagen>
En docker compose funcionaría así.
version: '3.9'
services:
web:
build: .
env_file:
- .env.list
Precedencia de variables de entorno
Ya que existen distintos lugares en los que se puede definir una variable de entorno vale la pena aclarar la precedencia con la que se resuelven conflictos de asignamiento. La siguiente lista muestra la precedencia desde el valor más fuerte hacía la más débil.
- docker-compose.yml
- HOST
- envfile
- Dockerfile
Cabe anotar que las variables de host y archivos serán tomadas en cuenta siempre y cuando se especifíquen en el dockerfile o en la línea de comandos.
Sin una variable está vacía en el archivo envfile se tomará en su lugar la del HOST si existe o la de mayor preferencia (docker compose file). Ej:
DEBUG_MODE=
Esto tiene un significado diferente en docker-compose.yml
ya que la signación vacía sobreescribe el valor dejándolo vacío para el contenedor!. Ya que este archivo es el de mayor precedencia el valor quedará absolutamente asignado.
version: "3.9"
services:
web:
build: .
environment:
- DEBUG_MODE= # setea el valor a vacío!!
Argumentos
Los argumentos son valores que puedes pasar al Dockerfile en tiempo de construcción. No están disponibles para los procesos que se ejecutan en el contenedor a menos que los asignes a una variable de entorno.
FROM ubuntu:20.04
ARG ARGUMENTO
ENV MY_VARIABLE=$ARGUMENTO
CMD echo $MY_VARIABLE
Al construir esta imagen, puedes pasar un valor para ARGUMENTO:
docker build --build-arg ARGUMENTO="valor_del_argumento" .
También es posible especificar un valor por defecto para un argumento en caso de que no se pase explícitamente.
FROM ubuntu:20.04
ARG ARGUMENTO=valor_por_defecto
ENV MY_VARIABLE=$ARGUMENTO
CMD echo $MY_VARIABLE