सिस्टमडॉक डॉकटर कंटेनर में इनहेरिट पर्यावरण चर


9

मेरे पास एक डॉकटर कंटेनर है जो सिस्टमड चल रहा है । मैं इसके अंतर्गत आने वाले अनुप्रयोगों के लिए पर्यावरण चर पास करना चाहता हूं।

जब मैं Docker ( /sbin/initकमांड लाइन के रूप में) से systemd शुरू करता हूं , तो Docker वेरिएबल्स को systemd में उजागर करता है, लेकिन चाइल्ड सर्विसेज के सामने नहीं आता है । यदि मैं systemd.setenv=...cmdline में जोड़ता हूं , तो चर पास हो जाते हैं। मैं एक क्लीनर समाधान की तलाश में हूं।

मैं /sbin/initशुरू किए गए अनुप्रयोगों के लिए पारित पर्यावरण चर को कैसे उजागर करूं ?

% 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=1अपनी कमान चलाते हुए देखने की उम्मीद करता हूं।

दूसरे शब्दों में, क्या सिस्टमड चर इसे शुरू करने वाले बच्चों को दे सकता है?

Dockerfile के लिए, github भंडार देखें ।

जवाबों:


9

पूछे गए प्रश्न का उत्तर देने के लिए (क्योंकि इसका कहीं और उत्तर नहीं दिया गया है)

"मैं इसके द्वारा शुरू किए गए अनुप्रयोगों के लिए पारित पर्यावरण चर / sbin / init को कैसे उजागर करूँ?"

कुछ परेशान चिड़चिड़ाहट की आवश्यकता है, और linux / proc filesystem का एक अत्यंत उपयोगी कार्य:

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

यह / proc / 1 / envion को पढ़ता है, जो कि PID 1 को दिया गया पर्यावरण है, लेकिन इसे nulls द्वारा सीमांकित किया गया है। यह नई रेखाओं के साथ नल को बदलने के लिए 'ट्र' का उपयोग करता है, और फिर उन रेखाओं पर पुनरावृत्त करता है और उन्हें एक पूर्वनिर्मित 'निर्यात' के साथ विकसित करता है, इसलिए वे बाल प्रक्रियाओं को दिखाई देते हैं।

नहीं-एक्सपोजिंग-पर्यावरण-चर अभी तक सिस्टमड का एक और "फीचर" है, और वे इसे बग नहीं मानते हैं।


3
मैं कहना चाहता हूं कि 'मुझे इस सुविधा की आवश्यकता नहीं है, मुझे पर्यावरण चर की आवश्यकता है'
डैनियल दाई

2

इस विवरण के अनुसार, एक systemd उपयोगकर्ता का उदाहरण पर्यावरण चर का वारिस नहीं करता है:

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

Oneshot systemd सेवा का उपयोग करने के लिए यहां एक सुझाव दिया गया है जो "फाइनल" सेवा के लिए एक EnvironmentFile को कॉन्फ़िगर करता है।

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


1
जांच करने पर भी विचार करें PassEnvironment=। इसने मुझे docker systemd पर्यावरण में मदद की।
फेलिकजेड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.