Kế thừa các biến môi trường trong bộ chứa Docker systemd


9

Tôi có một Docker container đang chạy systemd . Tôi muốn chuyển các biến môi trường cho các ứng dụng theo nó.

Khi tôi khởi động systemd từ bên trong Docker ( /sbin/initdưới dạng dòng lệnh), Docker hiển thị các biến cho systemd, nhưng không hiển thị cho các dịch vụ con . Nếu tôi thêm systemd.setenv=...vào cmdline, các biến được thông qua. Tôi đang tìm kiếm một giải pháp sạch hơn.

Làm cách nào để hiển thị các biến môi trường được truyền /sbin/initcho các ứng dụng được bắt đầu bởi nó?

% 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

Tôi hy vọng sẽ thấy VAR1=1trong khi chạy lệnh của tôi.

Nói cách khác, systemd có thể truyền các biến được truyền cho nó cho trẻ em không?

Đối với Dockerfile, xem kho lưu trữ github .

Câu trả lời:


9

Để trả lời câu hỏi được hỏi (vì dường như nó không được trả lời ở bất kỳ nơi nào khác)

"Làm cách nào để hiển thị các biến môi trường được truyền cho / sbin / init cho các ứng dụng được khởi động bởi nó?"

yêu cầu một số bash hơi khó chịu và một chức năng cực kỳ hữu ích của hệ thống tập tin linux / Proc:

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

Điều này đọc / Proc / 1 / envion, là môi trường được cung cấp cho PID 1, nhưng được giới hạn bởi null. Nó sử dụng 'tr' để thay thế các null bằng các dòng mới và sau đó lặp lại các dòng đó và loại bỏ chúng bằng một 'xuất khẩu' được chuẩn bị trước, để chúng có thể nhìn thấy các quy trình con.

Các biến không tiếp xúc với môi trường là một "tính năng" khác của systemd và họ không coi đó là một lỗi.


3
Tôi muốn nói 'Tôi không cần tính năng này, tôi cần các biến môi trường'
Daniel Dai

2

Theo mô tả này, một cá thể người dùng systemd không kế thừa các biến môi trường:

https://wiki.archlinux.org/index.php/Systemd/User#En môi_variables

Có một gợi ý ở đây là sử dụng dịch vụ systemd oneshot để cấu hình một môi trường cho dịch vụ "cuối cùng".

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


1
Cũng xem xét để kiểm tra PassEnvironment=. Nó giúp tôi trong môi trường docker systemd.
FelikZ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.