Mewarisi variabel lingkungan dalam wadah Docker systemd

9

Saya memiliki wadah Docker yang menjalankan systemd . Saya ingin meneruskan variabel lingkungan ke aplikasi di bawahnya.

Ketika saya memulai systemd dari dalam Docker ( /sbin/initsebagai baris perintah), Docker mengekspos variabel ke systemd, tetapi tidak mengekspos ke layanan anak . Jika saya menambahkan systemd.setenv=...ke cmdline, variabel akan diteruskan. Saya mencari solusi yang lebih bersih.

Bagaimana cara mengekspos variabel lingkungan yang diteruskan /sbin/initke aplikasi yang dimulai olehnya?

% docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -ti \
             -e VAR1=1 motiejus/systemd_fedora20 \
             init systemd.setenv=VAR2=2
...
Welcome to Fedora 20 (Heisenbug)!
...
[  OK  ] Reached target Multi-User System.
[root@740690365eb0 ~]# env | grep VAR
VAR2=2

Saya berharap untuk melihat VAR1=1saat menjalankan perintah saya.

Dengan kata lain, dapatkah systemd meneruskan variabel yang diteruskan ke anak-anak itu dimulai?

Untuk Dockerfile, lihat repositori github .

Motiejus Jakštys
sumber

Jawaban:

9

Untuk menjawab pertanyaan yang diajukan (sepertinya tidak dijawab di tempat lain)

"Bagaimana saya mengekspos variabel lingkungan yang diteruskan ke / sbin / init ke aplikasi yang dimulai olehnya?"

membutuhkan beberapa bash yang sedikit menjengkelkan, dan fungsi yang sangat berguna dari sistem file linux / proc:

# Import our environment variables from systemd
for e in $(tr "\000" "\n" < /proc/1/environ); do
        eval "export $e"
done

Ini bertuliskan / proc / 1 / envion, yang merupakan lingkungan yang diberikan kepada PID 1, tetapi dibatasi oleh nol. Ia menggunakan 'tr' untuk mengganti nol dengan baris baru, dan kemudian beralih ke baris itu dan mengevaluasinya dengan 'ekspor' yang diawali, sehingga dapat dilihat oleh proses anak.

Variabel tidak memaparkan lingkungan adalah "fitur" lain dari systemd, dan mereka tidak menganggapnya sebagai bug.

xrobau
sumber
3
Saya ingin mengatakan 'Saya tidak perlu fitur ini, saya perlu variabel lingkungan'
Daniel Dai
2

Menurut uraian ini, contoh pengguna systemd tidak mewarisi variabel lingkungan:

https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables

Ada saran di sini untuk menggunakan layanan systemesh oneshot yang mengkonfigurasi EnvironmentFile untuk layanan "final".

/programming/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos

janosi
sumber
1
Juga pertimbangkan untuk memeriksa PassEnvironment=. Ini membantu saya di lingkungan systemer docker.
FelikZ