run into entrypoint container compose commands attach bash docker environment-variables

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