Спадкові змінні середовища в системному контейнері Docker


9

У мене працює контейнер Docker . Я хочу передати змінні середовища в додатки під ним.

Коли я запускаю systemd з Docker ( /sbin/initяк командний рядок), 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:

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

Це read / proc / 1 / envion, що є середовищем, заданим PID 1, але розмежоване нулями. Він використовує 'tr' для заміни нулів новими рядками, а потім повторює ці рядки і оцінює їх заздалегідь запровадженим «експортом», щоб вони були видимими дочірніми процесами.

Змінні середовища, що не експонують, є ще однією "особливістю" системи, і вони не вважають це помилкою.


3
Я хочу сказати: «Мені ця функція не потрібна, мені потрібні змінні середовища»
Daniel Dai

2

Згідно з цим описом, системний екземпляр користувача не успадковує змінні середовища:

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

Тут є пропозиція використовувати службу onehot systemd, яка налаштовує EnvironmentFile для "остаточної" послуги.

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


1
Також розглянути можливість перевірки PassEnvironment=. Це допомогло мені в середовищі docker systemd.
FelikZ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.