Docker Container'dan Ortam Değişkenini Alın


127

Dockerfile'da bildirilmemiş bir docker container'dan ortam değişkenini almanın en basit yolu nedir ?

Örneğin, bir docker exec container /bin/bashoturumda ayarlanan bir ortam değişkeni ?

Yapabilirim docker exec container env | grep ENV_VAR, ancak sadece değeri döndüren bir şeyi tercih ederim.

Kullanmayı denedim docker exec container echo "$ENV_VAR", ancak ikame kapsayıcının dışında gerçekleşiyor gibi görünüyor, bu yüzden env değişkenini kapsayıcıdan değil, env değişkenini kendi bilgisayarımdan alıyorum.

Teşekkürler.


Env ve grep'i kullanmamak için bir neden var mı?
aisbaa

Sadece değere ihtiyacım var. Doğru anlarsam, grep çağrısının çıktısını ayrıştırmam gerekir ve bundan kaçınmayı tercih ederim.
Citronen

Bir exec oturumunda ayarlanan değişkenin birincil süreci veya sonraki yürütme oturumlarını etkilemediğini düşünmüştüm.
Paul Becotte

Yanıtlar:


139

echo "$ENV_VAR"Değişken ikamesinin kapta gerçekleşmesi için kabın içinde çalıştırmanın uygun yolu şudur:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'

4
DİKKAT, tüm bu yanıtların bir kabuğa bağlı olduğuna dikkat edin. Yürütülebilir ve sıfırdan temel görüntüsü olan env değişkenlerini alamıyorum.
Richard

docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik

"Hata: Böyle bir kapsayıcı yok: kapsayıcı" hatası alıyorum. SSH üzerinden giriş yaptıktan sonra komutu çalıştırıyorum.
kunwar nitesh

1
@kunwarnitesh: "konteyner" i, üzerinde çalışmak istediğiniz konteynerin adıyla değiştirmeniz gerekiyor.
jwodder

1
Yap containerkelime insanlar bir değişken anlamaları böyle
Anwar

118

Tüm env değişkenlerini görüntülemek için:

docker exec container env

Bir tane almak için:

docker exec container env | grep VARIABLE | cut -d'=' -f2

Sorum o rotaya gitmemeyi tercih ettiğimi söylüyor. Ayrıca, takip sorusu: docker exec container envve docker exec -it container /bin/bashardından envfarklı şeyler tükürmek. Neden?
Citronen

Ah ... bu durumu böyle yapan docker imajını oluşturmamın özel bir yolu olabilir ...
Citronen

2
Hm, şimdi çok daha zor. Deneyin docker inspect container.
aisbaa

docker inspect containeraynı sınırlamaya sahip görünüyor. Konteyneri çalıştırdıktan sonra bir ortam değişkeni oluşturursam, bu bir çağrıda görünmüyor docker inspect(env bölümünde).
Citronen

Bunun şu anda kabul edilen cevaptan daha iyi bir cevap olduğuna inanıyorum. bashÖrneğin, komutla desteklenmeyen birkaç konteynerimiz var alpine-node. Yani kullanmak exec container bash -c "echo $ENV_VAR"işe yaramıyor. Kullanımı exec container envBenim durumumda için çalışmalarını. Kullanmak exec container printenvda işe yarar.
rahmatns

78

Bunun printenv VARIABLEyerine kullanabilirsiniz /bin/bash -c 'echo $VARIABLE. Çok daha basittir ve ikame yapmaz:

docker exec container printenv VARIABLE

7
Bu son cevap olmalı
Ki Jéy

5
veya sadece printenvtüm değişkenleri yazdırmak için.
naXa

Bu, kubernetes için bile çalışır: kubectl exec pod-name printenv MY_VARIABLE.
Teebu

58

Kullanmanın dezavantajı, çalışan bir konteyner docker execgerektirmesidir , bu nedenle bir konteynerin çalıştığından emin değilseniz kullanışlı olabilir.docker inspect -f

Örnek 1. Belirtilen kapta boşlukla ayrılmış ortam değişkenlerinin bir listesini çıktı olarak alın:

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

çıktı şöyle görünecek:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Örnek 2. Her env değişkenini yeni satırda ve grepgerekli öğelerin çıktısını alın, örneğin, mysql kapsayıcısının ayarları şu şekilde alınabilir:

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

çıktı:

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

Örnek 3. Komut dosyalarınızda doğrudan kullanılabilecek bash dostu bir çıktı elde etmek için yukarıdaki örneği değiştirelim :

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

çıktı:

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

Daha derine inmek istiyorsanız , formatın tüm ayrıntılarıyla birlikte Go'nun metin / şablon paketi belgelerine gidin .


1
bu en iyi cevap. Sanırım ayrı bir sorunun cevabı olmalı (konteyner
çalışmadığında

Benim için işe yarayan tek cevap bu. docker execher zaman konteynerimin bilmediğini söyledi.
Good Night Nerd Pride

7

Yukarıdaki cevapların hiçbiri size çalışmayan bir kaptan bir değişkeni nasıl çıkaracağınızı göstermez ( echoyaklaşımı ile kullanırsanız, runherhangi bir çıktı alamazsınız).

Basitçe runile printenv, yani ister:

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

(Çalışmak docker-composeyerine bunun da olduğunu unutmayın docker)


çok basit! Bu yaklaşıma karar verdim.
opncow

veya sadece printenvtüm değişkenleri yazdırmak için.
naXa


0

@ aisbaa'nın yanıtı, ortam değişkeninin ne zaman bildirildiğini umursamıyorsanız işe yarar. Ortam değişkenini istiyorsanız, bir exec /bin/bashoturumun içinde bildirilmiş olsa bile , aşağıdaki gibi bir şey kullanın:

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

Çok hoş değil ama işi hallediyor.

Daha sonra değeri almak için şunu kullanın:

echo ${out[1]}

Jwodder'ın cevabına bakın.
Citronen

0

Bu komut, ana bilgisayardaki docker yığını işlemlerinin ortamını inceler:

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

0

Komut entrypointile çalışmayan bir konteyneri değiştirebiliriz docker run.

Örnek PATH ortam değişkenini gösterir:

  1. using bashand echo: Bu yanıtecho herhangi bir çıktı üretmeyeceğini iddia eder , bu da yanlıştır.

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

    docker run --rm --entrypoint printenv <container> PATH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.