รับค่าตัวแปรสภาพแวดล้อมใน systemd Docker container


9

ฉันมีหางภาชนะทำงาน systemd ฉันต้องการส่งผ่านตัวแปรสภาพแวดล้อมไปยังแอปพลิเคชันภายใต้

เมื่อฉันเริ่มต้นจากภายใน systemd หาง ( /sbin/initเป็นบรรทัดคำสั่ง), หาง exposes ตัวแปรเพื่อ 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ในขณะที่ใช้คำสั่งของฉัน

กล่าวอีกนัยหนึ่ง systemd ส่งผ่านตัวแปรให้กับเด็ก ๆ ที่เริ่มต้นได้หรือไม่

สำหรับ Dockerfile ดูพื้นที่เก็บข้อมูล GitHub

คำตอบ:


9

เพื่อตอบคำถามที่ถาม (ดูเหมือนจะไม่ได้รับคำตอบจากที่อื่น)

"ฉันจะเปิดเผยตัวแปรสภาพแวดล้อมที่ส่งผ่านไปยัง / sbin / init ไปยังแอปพลิเคชันที่เริ่มต้นได้อย่างไร"

ต้องการทุบตีที่ระคายเคืองเล็กน้อยและฟังก์ชั่นที่มีประโยชน์อย่างมากของระบบไฟล์ linux / proc:

# 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 มันใช้ 'tr' เพื่อแทนที่ nulls ด้วยบรรทัดใหม่แล้ววนซ้ำเหนือบรรทัดเหล่านั้นและ evals พวกเขาด้วย 'เอ็กซ์พอร์ต' ที่ถูกผนวกรวมดังนั้นพวกเขาจึงมองเห็นกระบวนการลูกได้

ตัวแปรที่ไม่เปิดเผย - สภาพแวดล้อมเป็นอีก "คุณสมบัติ" ของ systemd และพวกเขาไม่คิดว่ามันเป็นข้อผิดพลาด


3
ฉันต้องการพูดว่า 'ฉันไม่ต้องการคุณสมบัตินี้ฉันต้องการตัวแปรสภาพแวดล้อม'
Daniel Dai

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
FelikZ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.