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.