bash - into - Obtener variable de entorno del contenedor Docker
docker run bash into container (7)
¿Cuál es la forma más sencilla de obtener una variable de entorno de un contenedor Docker que no ha sido declarado en el Dockerfile ?
Por ejemplo, ¿una variable de entorno que se ha configurado a través de alguna sesión de
docker exec container /bin/bash
?
Puedo hacer
docker exec container env | grep ENV_VAR
docker exec container env | grep ENV_VAR
, pero preferiría algo que solo devuelva el valor.
Intenté usar
docker exec container echo "$ENV_VAR"
, pero la sustitución parece ocurrir fuera del contenedor, por lo que no obtengo la env var del contenedor, sino la env var de mi propia computadora.
Gracias.
Este comando inspecciona el entorno de los procesos de Docker stack en el host:
pidof dockerd containerd containerd-shim | tr '' '' ''/n'' /
| xargs -L1 -I{} -- sudo xargs -a ''/proc/{}/environ'' -L1 -0
La desventaja de usar
docker exec
es que requiere un contenedor en
ejecución
, por lo que
docker inspect -f
podría ser útil si no está seguro de que un contenedor se esté ejecutando.
Ejemplo 1. Salida de 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. Imprima cada env env en una nueva línea y seleccione los elementos necesarios, por ejemplo, la configuración del contenedor mysql podría recuperarse así:
docker inspect -f /
''{{range $index, $value := .Config.Env}}{{println $value}}{{end}}'' /
container_name | grep MYSQL_
dará salida:
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 amigable de bash que se pueda usar directamente en sus scripts:
docker inspect -f /
''{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}'' /
container_name | grep MYSQL
dará salida:
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 text/template Go con todos los detalles del formato.
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 bash -c ''echo "$ENV_VAR"''
La respuesta de @ aisbaa funciona si no le importa cuándo se declaró la variable de entorno.
Si desea la variable de entorno, incluso si se ha declarado dentro de una sesión
exec /bin/bash
, use algo como:
IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)
No es muy bonito, pero hace el trabajo.
Para obtener el valor, use:
echo ${out[1]}
Ninguna de las respuestas anteriores muestra cómo extraer una variable de un contenedor que no se está ejecutando (si usa el enfoque
echo
con
run
, no obtendrá ningún resultado).
Simplemente
run
con
printenv
, así:
docker run --rm <container> printenv <MY_VAR>
(Tenga en cuenta que
docker-compose
lugar de
docker
también funciona)
Para ver todas las variables env:
docker exec container env
Para obtener uno:
docker exec container env | grep VARIABLE | cut -d''='' -f2
Puede usar
printenv VARIABLE
lugar de
/bin/bash -c ''echo $VARIABLE
.
Es mucho más simple y no realiza sustitución:
docker exec container printenv VARIABLE