Obtener variable de entorno del contenedor Docker

124

¿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 establecido en alguna docker exec container /bin/bashsesión?

Puedo hacerlo docker exec container env | grep ENV_VAR, pero preferiría algo que solo devuelva el valor.

He intentado 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.

Citronen
fuente
¿Hay alguna razón por la que le gustaría no usar env y grep?
aisbaa
Solo necesito el valor. Si entiendo correctamente, necesitaría analizar la salida de la llamada grep, y prefiero evitar eso.
Citronen
¿Pensé que la variable que se configuró en una sesión ejecutiva no afecta el proceso primario o las sesiones ejecutivas posteriores?
Paul Becotte

Respuestas:

136

La forma correcta de ejecutarse 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"'
jwodder
fuente
44
AVISO que todas estas respuestas dependen de algún shell. No puedo obtener variables env con un ejecutable y una imagen base scratch.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik
Recibo el error "Error: No existe ese contenedor: contenedor". Estoy ejecutando el comando después de iniciar sesión a través de SSH.
kunwar nitesh
1
@kunwarnitesh: debe reemplazar "contenedor" con el nombre del contenedor en el que desea operar.
jwodder
1
Hacer containerque la gente entienda que es una variable
Anwar
117

Para ver todas las variables env:

docker exec container env

Para obtener uno:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
fuente
Mi pregunta dice que preferiría no seguir esa ruta. Además, pregunta de seguimiento: docker exec container envy docker exec -it container /bin/bashy luego envescupir cosas diferentes. ¿Por qué?
Citronen
Ah ... podría ser la forma específica en que estoy construyendo la imagen del acoplador que hace que este sea el caso ...
Citronen
2
Hm, mucho más difícil ahora. Tratar docker inspect container.
aisbaa
docker inspect containerParece tener la misma limitación. Si creo una variable de entorno después de ejecutar el contenedor, no aparece en una llamada a docker inspect(en la sección env).
Citronen
Creo que esta es una mejor respuesta que la respuesta actualmente aceptada. Tenemos varios contenedores que no son compatibles con el bashcomando, por ejemplo alpine-node. Así que usar exec container bash -c "echo $ENV_VAR"no funciona. Usando exec container envobras para mi caso. Usar exec container printenvtambién funciona.
Rahmatns
78

Puedes usar en printenv VARIABLElugar de /bin/bash -c 'echo $VARIABLE. Es mucho más simple y no realiza sustitución:

docker exec container printenv VARIABLE
gentooboontoo
fuente
77
Esta debería ser la respuesta final
Ki Jéy
55
o simplemente printenvpara imprimir todas las variables.
naXa
Esto funciona incluso para kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu
58

La desventaja de usar docker execes que requiere un contenedor en ejecución , por lo que docker inspect -fpuede 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 variable de entorno en una nueva línea y greplos 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 texto / plantilla de Go con todos los detalles del formato.

Sergiy Sokolenko
fuente
1
Esa es la mejor respuesta. Creo que debería ser la respuesta en una pregunta separada (cuando el contenedor está inactivo)
Nickolay Kondratenko
Esta es la única respuesta que funcionó para mí. docker execSiempre dije que mi contenedor no se sabe.
Good Night Nerd Pride
7

Ninguna de las respuestas anteriores le muestra cómo extraer una variable de un contenedor que no se está ejecutando (si utiliza el echoenfoque con run, no obtendrá ningún resultado).

Simplemente runcon printenv, así:

docker run --rm <container> printenv <MY_VAR>

(Tenga docker-composeen cuenta que en lugar de dockerfunciona también)

sarink
fuente
muy sencillo! Me conformé con este enfoque.
opncow
o simplemente printenvpara imprimir todas las variables.
naXa
2

Si por casualidad usa VSCode y ha instalado la extensión docker , simplemente right+ clicken el docker que desea verificar (dentro de la extensión docker ), clicken Inspeccionar y allí buscar env , encontrará todos sus valores de variables env

ddieppa
fuente
0

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 exec /bin/bashsesión, 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]}
Citronen
fuente
Ver la respuesta de jwodder.
Citronen
0

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
MatteoOreficeIT
fuente
0

Podemos modificar entrypointun contenedor que no se ejecuta con el docker runcomando.

Ejemplo muestra la variable de entorno PATH:

  1. usando bashy echo: Esta respuesta afirma que echono producirá ningún resultado, lo cual es incorrecto.

    docker run --rm --entrypoint bash <container> -c 'echo "$PATH"'
  2. utilizando printenv

    docker run --rm --entrypoint printenv <container> PATH
Sathish
fuente