Systemd Docker kapsayıcısındaki ortam değişkenlerini devral


9

Systemd çalıştıran bir Docker kapsayıcı var . Ortam değişkenlerini altındaki uygulamalara aktarmak istiyorum.

Dock içinden systemd'yi başlattığımda ( /sbin/initkomut satırı olarak) Docker değişkenleri systemd'ye maruz bırakır, ancak alt hizmetlere maruz bırakmaz . Ben eklerseniz systemd.setenv=...cmdline için, değişkenler geçirilir. Daha temiz bir çözüm arıyorum.

Başladığı /sbin/inituygulamalara geçirilen ortam değişkenlerini nasıl gösterebilirim ?

% 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

VAR1=1Komutumu çalıştırırken görmeyi bekliyorum .

Başka bir deyişle, systemd değişkenlere çocuklara aktarılan değişkenleri başlatabilir mi?

Dockerfile için github deposuna bakın .

Yanıtlar:


9

Sorulan soruyu cevaplamak için (başka hiçbir yere cevaplanmamış gibi görünüyor)

"/ Sbin / init öğesine aktarılan ortam değişkenlerini başlattığı uygulamalara nasıl maruz bırakırım?"

biraz tahriş edici bash ve linux / proc dosya sisteminin son derece kullanışlı bir işlevi gerektirir:

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

Bu, PID 1'e verilen ortam olan / proc / 1 / envion'u okur, ancak boş değerlerle sınırlandırılır. Boşları yeni satırlarla değiştirmek için 'tr' kullanır ve daha sonra bu satırlar üzerinde yinelenir ve bunları üstteki bir 'dışa aktarma' ile değiştirir, böylece alt süreçler tarafından görülebilirler.

Ortaya çıkmayan ortam değişkenleri, systemd'in bir başka "özelliği" dir ve bunu bir hata olarak görmezler.


3
'Bu özelliğe ihtiyacım yok, ortam değişkenlerine ihtiyacım var' demek istiyorum
Daniel Dai

2

Bu açıklamaya göre, bir systemd kullanıcı örneği ortam değişkenlerini devralmaz:

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

Burada, "son" hizmet için bir EnvironmentFile yapılandıran oneshot systemd hizmetinin kullanılması için bir öneri vardır.

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


1
Ayrıca kontrol etmeyi de düşünün PassEnvironment=. Docker systemd ortamında bana yardımcı oldu.
FelikZ
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.