Obter variável de ambiente do Docker Container

124

Qual é a maneira mais simples de obter uma variável de ambiente de um contêiner de docker que não foi declarado no Dockerfile ?

Por exemplo, uma variável de ambiente que foi definida por meio de alguma docker exec container /bin/bashsessão?

Eu posso fazer docker exec container env | grep ENV_VAR, mas eu preferiria algo que apenas retorna o valor.

Eu tentei usar docker exec container echo "$ENV_VAR", mas a substituição parece ocorrer fora do contêiner, então não recebo o env var do contêiner, mas o env var do meu próprio computador.

Obrigado.

Citronen
fonte
Existe uma razão pela qual gostaria de não usar env e grep?
aisbaa
Eu só preciso do valor. Se entendi corretamente, precisaria analisar a saída da chamada grep e prefiro evitar isso.
Citronen
Eu pensei que a variável que foi definida em uma sessão de exec não afeta o processo primário ou as sessões de exec subsequentes?
Paul Becotte 3/15/15

Respostas:

136

A maneira correta de executar echo "$ENV_VAR"dentro do contêiner para que a substituição da variável ocorra no contêiner é:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'
jwodder
fonte
4
AVISO que todas essas respostas dependem de algum shell. Eu não sou capaz de obter variáveis ​​env com um executável e uma imagem de base de rascunho.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik
Estou recebendo o erro "Erro: não existe esse container: container". Estou executando o comando após o login através do SSH.
Kunwar nitesh
1
@kunwarnitesh: você precisa substituir "container" pelo nome do container em que deseja operar.
jwodder
1
Marca containerpalavra de tal forma que as pessoas entendam que é uma variável
Anwar
117

Para visualizar todas as variáveis ​​env:

docker exec container env

Para obter um:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
fonte
Minha pergunta diz que eu preferiria não seguir esse caminho. Além disso, follow-up questão: docker exec container enve docker exec -it container /bin/bashe depois envcuspir coisas diferentes. Por quê?
Citronen
Ah ... pode ser o caminho específico que eu estou construindo a imagem janela de encaixe que faz este o caso ...
Citronen
2
Hm, muito mais difícil agora. Tente docker inspect container.
aisbaa 02/12/2015
docker inspect containerparece ter a mesma limitação. Se eu criar uma variável de ambiente depois de executar o contêiner, ela não aparecerá em uma chamada para docker inspect(na seção env).
Citronen
Eu acredito que esta é uma resposta melhor do que a resposta atualmente aceita. Temos vários contêineres que não são suportados com bashcomando, por exemplo alpine-node. Então, usar exec container bash -c "echo $ENV_VAR"não está funcionando. Usando exec container envobras para o meu caso. Usar exec container printenvtambém funciona.
rahmatns 31/01
78

Você pode usar em printenv VARIABLEvez de /bin/bash -c 'echo $VARIABLE. É muito mais simples e não realiza substituição:

docker exec container printenv VARIABLE
gentooboontoo
fonte
7
Esta deve ser a resposta final
Ki Jey
5
ou apenas printenvpara imprimir todas as variáveis.
NaXa
Isso funciona mesmo para kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu 18/06
58

A desvantagem de usar docker execé que ele requer um contêiner em execução ; portanto, docker inspect -fpode ser útil se você não tiver certeza de que um contêiner está em execução.

Exemplo 1. Saída uma lista de variáveis ​​de ambiente separadas por espaço no contêiner especificado:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}{{$value}} {{end}}' container_name

a saída ficará assim:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Exemplo # 2. Saída cada env var na nova linha e grepos itens necessários, por exemplo, as configurações do contêiner do mysql podem ser recuperadas assim:

docker inspect -f \
    '{{range $index, $value := .Config.Env}}{{println $value}}{{end}}' \
    container_name | grep MYSQL_

irá produzir:

MYSQL_PASSWORD=secret
MYSQL_ROOT_PASSWORD=supersecret
MYSQL_USER=demo
MYSQL_DATABASE=demodb
MYSQL_MAJOR=5.5
MYSQL_VERSION=5.5.52

Exemplo # 3. Vamos modificar o exemplo acima para obter uma saída amigável do bash, que pode ser usada diretamente em seus scripts:

docker inspect -f \
   '{{range $index, $value := .Config.Env}}export {{$value}}{{println}}{{end}}' \
   container_name | grep MYSQL

irá produzir:

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

Se você quiser aprofundar, vá para a documentação do pacote de texto / modelo do Go com todos os detalhes do formato.

Sergiy Sokolenko
fonte
1
essa é a melhor resposta. Eu acho que é deve ser a resposta sobre uma questão separada (quando o recipiente está em baixo)
Nickolay Kondratenko
Esta é a única resposta que funcionou para mim. docker execsempre disse que meu contêiner não é conhecido.
Good Nerd Pride
7

Nenhuma das respostas acima mostra como extrair uma variável de um contêiner não em execução (se você usar a echoabordagem com run, não obterá nenhuma saída).

Simplesmente runcom printenv:

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

(Observe que, em docker-composevez de dockerfuncionar também)

sarink
fonte
muito simples! Eu me conformei com essa abordagem.
opncow 9/01/19
ou apenas printenvpara imprimir todas as variáveis.
NaXa
2

Se por acaso você usa o VSCode e instalou a extensão do docker , basta right+ clickno docker que deseja verificar (dentro do docker extension ), clickno Inspecionar e procurar por env , você encontrará todos os seus valores de variáveis ​​env

ddieppa
fonte
0

A resposta de @ aisbaa funciona se você não se importa quando a variável de ambiente foi declarada. Se você deseja a variável de ambiente, mesmo que tenha sido declarada dentro de uma exec /bin/bashsessão, use algo como:

IFS="=" read -a out <<< $(docker exec container /bin/bash -c "env | grep ENV_VAR" 2>&1)

Não é muito bonito, mas faz o trabalho.

Para obter o valor, use:

echo ${out[1]}
Citronen
fonte
Veja a resposta de jwodder.
Citronen
0

Este comando inspeciona o ambiente dos processos da docker stack no host:

pidof   dockerd containerd containerd-shim | tr ' ' '\n' \
      | xargs -L1 -I{} -- sudo xargs -a '/proc/{}/environ' -L1 -0
MatteoOreficeIT
fonte
0

Podemos modificar entrypointum contêiner não em execução com o docker runcomando

Exemplo de variável de ambiente PATH de show:

  1. using bashand echo: Esta resposta afirma que echonão produzirá nenhuma saída incorreta.

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

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