Variables de Entorno y Argumentos en Docker

Author
Por Darío Rivera
Publicado el 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

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.