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.


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"'

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

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

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.


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)


sangat mudah! Saya memilih pendekatan ini.
opncow

atau hanya printenvuntuk mencetak semua variabel.
naXa


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]}

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.