Obtener variable de entorno del contenedor Docker
¿Cuál es la forma más sencilla de obtener una variable de entorno de un contenedor acoplable que no se ha declarado en Dockerfile ?
Por ejemplo, ¿una variable de entorno que se ha configurado a través de alguna docker exec container /bin/bash
sesión?
Puedo hacerlo docker exec container env | grep ENV_VAR
, pero preferiría algo que simplemente devuelva el valor.
Intenté usarlo docker exec container echo "$ENV_VAR"
, pero la sustitución parece ocurrir fuera del contenedor, por lo que no obtengo la var env del contenedor, sino la var env de mi propia computadora.
Gracias.
Para ver todas las variables ambientales:
docker exec container env
Para conseguir uno:
docker exec container env | grep VARIABLE | cut -d'=' -f2
La forma correcta de ejecutar echo "$ENV_VAR"
dentro del contenedor para que la sustitución de variables ocurra en el contenedor es:
docker exec <container_id> bash -c 'echo "$ENV_VAR"'
Puedes usar printenv VARIABLE
en lugar de /bin/bash -c 'echo $VARIABLE
. Es mucho más simple y no realiza sustitución:
docker exec container printenv VARIABLE
La desventaja de usarlo docker exec
es que requiere un contenedor en ejecución , por lo que docker inspect -f
puede resultar útil si no está seguro de que se esté ejecutando un contenedor.
Ejemplo 1. Genere una lista de variables de entorno separadas por espacios en el contenedor especificado:
docker inspect -f \
'{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name
la salida se verá así:
ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3
Ejemplo #2. Genere cada var env en una nueva línea y grep
los elementos necesarios; por ejemplo, la configuración del contenedor mysql se podría recuperar de esta manera:
docker inspect -f \
'{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
container_name | grep MYSQL_
generará:
MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52
Ejemplo #3. Modifiquemos el ejemplo anterior para obtener una salida compatible con bash que pueda usarse directamente en sus scripts:
docker inspect -f \
'{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
container_name | grep MYSQL
generará:
export MYSQL_PASSWORD=secret
export MYSQL_ROOT_PASSWORD=supersecret
export MYSQL_USER=demo
export MYSQL_DATABASE=demodb
export MYSQL_MAJOR=5.5
export MYSQL_VERSION=5.5.52
Si desea profundizar más, vaya a la documentación del paquete de texto/plantilla de Go con todos los detalles del formato.