Dapatkan Variabel Lingkungan dari Docker Container

126

Apa cara paling sederhana untuk mendapatkan variabel lingkungan dari kontainer buruh pelabuhan yang belum dideklarasikan di Dockerfile ?

Misalnya, variabel lingkungan yang telah ditetapkan melalui beberapa docker exec container /bin/bashsesi?

Saya bisa melakukannya docker exec container env | grep ENV_VAR, tetapi saya lebih suka sesuatu yang hanya mengembalikan nilainya.

Saya sudah mencoba menggunakan docker exec container echo "$ENV_VAR", tetapi tampaknya terjadi substitusi di luar container, jadi saya tidak mendapatkan env var dari container, melainkan env var dari komputer saya sendiri.

Terima kasih.

Citronen
sumber
Apakah ada alasan mengapa Anda tidak ingin menggunakan env dan grep?
aisbaa
Saya hanya butuh nilainya. Jika saya mengerti dengan benar, saya perlu mengurai output dari panggilan grep, dan saya lebih suka menghindarinya.
Citronen
Saya mengira variabel yang ditetapkan dalam sesi exec tidak mempengaruhi proses utama atau sesi exec berikutnya?
Paul Becotte

Jawaban:

139

Cara yang tepat untuk menjalankan echo "$ENV_VAR"di dalam penampung sehingga penggantian variabel terjadi di penampung adalah:

docker exec <container_id> bash -c 'echo "$ENV_VAR"'
jwodder
sumber
4
PERHATIKAN bahwa semua jawaban ini bergantung pada beberapa shell. Saya tidak bisa mendapatkan variabel env dengan gambar yang dapat dieksekusi dan dasar awal.
Richard
docker run --rm -it CONTAINER bash -c 'echo "$MY_ENV_VAR"'
Henrik
Saya mendapatkan error "Error: Tidak ada container: container". Saya menjalankan perintah setelah login melalui SSH.
kunwar nitesh
1
@kunwarnitesh: Anda perlu mengganti "container" dengan nama container yang ingin Anda operasikan.
jwodder
1
Buat containerkata-kata sedemikian rupa sehingga orang-orang mengerti bahwa itu adalah variabel
Anwar
117

Untuk melihat semua variabel env:

docker exec container env

Untuk mendapatkannya:

docker exec container env | grep VARIABLE | cut -d'=' -f2
aisbaa
sumber
Pertanyaan saya mengatakan bahwa saya memilih untuk tidak menempuh rute itu. Juga, pertanyaan lanjutan: docker exec container envdan docker exec -it container /bin/bashkemudian envmemuntahkan hal yang berbeda. Mengapa?
Citronen
Ah ... mungkin cara spesifik saya membangun citra buruh pelabuhan yang membuat ini terjadi ...
Citronen
2
Hm, jauh lebih sulit sekarang. Coba docker inspect container.
aisbaa
docker inspect containersepertinya memiliki batasan yang sama. Jika saya membuat variabel lingkungan setelah saya menjalankan penampung, itu tidak muncul dalam panggilan ke docker inspect(di bagian env).
Citronen
Saya yakin ini adalah jawaban yang lebih baik daripada jawaban yang diterima saat ini. Kami memiliki beberapa wadah yang tidak didukung dengan bashperintah, misalnya alpine-node. Jadi menggunakan exec container bash -c "echo $ENV_VAR"tidak berhasil. Menggunakan exec container envkarya untuk kasus saya. Menggunakan exec container printenvjuga berfungsi.
rahmatns
78

Anda dapat menggunakan printenv VARIABLEsebagai pengganti /bin/bash -c 'echo $VARIABLE. Ini jauh lebih sederhana dan tidak melakukan substitusi:

docker exec container printenv VARIABLE
gentooboontoo
sumber
7
Ini harus menjadi jawaban akhir
Ki Jéy
5
atau hanya printenvuntuk mencetak semua variabel.
naXa
Ini bekerja bahkan untuk kubernetes: kubectl exec pod-name printenv MY_VARIABLE.
Teebu
58

Kelemahan penggunaan docker execadalah membutuhkan wadah yang berjalan , jadidocker inspect -f mungkin berguna jika Anda tidak yakin wadah sedang berjalan.

Contoh 1. Keluarkan daftar variabel lingkungan yang dipisahkan spasi di penampung yang ditentukan:

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

outputnya akan terlihat seperti ini:

ENV_VAR1=value1 ENV_VAR2=value2 ENV_VAR3=value3

Contoh # 2. Keluarkan setiap env var pada baris baru dan grepitem yang dibutuhkan, misalnya, pengaturan wadah mysql dapat diambil seperti ini:

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

akan mengeluarkan:

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

Contoh # 3. Mari kita ubah contoh di atas untuk mendapatkan keluaran ramah bash yang dapat langsung digunakan dalam skrip Anda:

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

akan mengeluarkan:

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

Jika Anda ingin mempelajari lebih dalam, buka dokumentasi paket teks / template Go dengan semua detail formatnya.

Sergiy Sokolenko
sumber
1
itulah jawaban terbaik. Saya pikir itu harus menjadi jawaban untuk pertanyaan terpisah (saat kontainer mati)
Nickolay Kondratenko
Ini adalah satu-satunya jawaban yang berhasil bagi saya. docker execselalu bilang wadah saya tidak tahu.
Good Night Nerd Pride
7

Tak satu pun dari jawaban di atas menunjukkan cara mengekstrak variabel dari penampung yang tidak berjalan (jika Anda menggunakan echopendekatan denganrun , Anda tidak akan mendapatkan keluaran apa pun).

Cukup rundengan printenv, seperti:

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

(Perhatikan bahwa docker-composealih - alih dockerbekerja juga)

sarink
sumber
sangat mudah! Saya memilih pendekatan ini.
opncow
atau hanya printenvuntuk mencetak semua variabel.
naXa
2

Jika kebetulan Anda menggunakan VSCode dan telah menginstal ekstensi buruh pelabuhan , cukup right+ clickpada buruh pelabuhan yang ingin Anda periksa (dalam ekstensi buruh pelabuhan ), clickdi Inspect , dan di sana cari env , Anda akan menemukan semua nilai variabel env Anda

ddieppa
sumber
0

Jawaban @ aisbaa berfungsi jika Anda tidak peduli ketika variabel lingkungan dideklarasikan. Jika Anda menginginkan variabel lingkungan, meskipun telah dideklarasikan di dalam exec /bin/bashsesi, gunakan sesuatu seperti:

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

Ini tidak terlalu cantik, tapi menyelesaikan pekerjaan.

Untuk mendapatkan nilainya, gunakan:

echo ${out[1]}
Citronen
sumber
Lihat jawaban jwodder.
Citronen
0

Perintah ini memeriksa lingkungan proses tumpukan buruh pelabuhan di host:

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

Kita dapat memodifikasi entrypointwadah yang tidak berjalan dengan docker runperintah.

Contoh menunjukkan variabel lingkungan PATH:

  1. menggunakan bashdan echo: Jawaban ini mengklaim bahwa echotidak akan menghasilkan output apa pun, yang salah.

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

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